Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Swift编译器挂起!是虫子吗?_Xcode_Swift_Ios8 - Fatal编程技术网

Xcode Swift编译器挂起!是虫子吗?

Xcode Swift编译器挂起!是虫子吗?,xcode,swift,ios8,Xcode,Swift,Ios8,有一次,当我在处理一个Swift项目时,Xcode被状态栏中的“编译Swift源代码”消息卡住了。不管我等了多久,汇编都没有完成。我回顾了最近所做的更改,很快意识到让编译器感到困惑的是一个非常简单的枚举构造。下面是一个说明问题的游乐场示例 创建一个新的游乐场并粘贴此代码。你看到输出了吗 // Playground - noun: a place where people can play import UIKit enum FastingType: Int { case NoFast

有一次,当我在处理一个Swift项目时,Xcode被状态栏中的“编译Swift源代码”消息卡住了。不管我等了多久,汇编都没有完成。我回顾了最近所做的更改,很快意识到让编译器感到困惑的是一个非常简单的枚举构造。下面是一个说明问题的游乐场示例

创建一个新的游乐场并粘贴此代码。你看到输出了吗

// Playground - noun: a place where people can play

import UIKit

enum FastingType: Int {
    case NoFast=0, Vegetarian, FishAllowed, FastFree, Cheesefare
}

class Fasting
{
    var allowedFood = [
        .NoFast:        ["meat", "fish", "milk", "egg", "cupcake"],
        .Vegetarian:    ["vegetables", "bread", "nuts"],
        .FishAllowed:   ["fish", "vegetables", "bread", "nuts"],
        .FastFree:      ["cupcake", "meat", "fish", "cheese"],
        .Cheesefare:    ["cheese", "cupcake", "milk", "egg"]
    ]

    func getAllowedFood(type: FastingType) -> [String] {
        return allowedFood[type]
    }
}


var fasting = Fasting()
println(fasting.getAllowedFood(.Vegetarian))
println("Hello world")
在我的机器上,忙指示灯一直在旋转,没有任何消息。我在Xcode6.1(6A1052c)和Xcode6.2-beta(6C86e)上都试过了

这看起来像Swift编译器中的bug吗?还是我的代码有问题

更新:

有几个人注意到我忘记了
getAllowedFood
函数中的返回类型。但是,仅此修复并不能解决问题。编译器仍然挂起

评论中建议了一种变通方法:

斯威夫特似乎很难解释你的字典。给字典一个显式类型来“帮助”编译器通常是个好主意

以下添加内容“取消冻结”编译器:

var allowedFood: [FastingType: [String]]

是的,这可以被认为是一个编译器错误。编译器在确定字典中键的类型时遇到问题。通过给字典一个显式类型或确保第一个值是用
FastingType.NoFast
完全指定的,可以消除无限循环行为

试试这个:

enum FastingType: Int {
    case NoFast=0, Vegetarian, FishAllowed, FastFree, Cheesefare
}

class Fasting
{
    var allowedFood:[FastingType: [String]] = [
        .NoFast:        ["meat", "fish", "milk", "egg", "cupcake"],
        .Vegetarian:    ["vegetables", "bread", "nuts"],
        .FishAllowed:   ["fish", "vegetables", "bread", "nuts"],
        .FastFree:      ["cupcake", "meat", "fish", "cheese"],
        .Cheesefare:    ["cheese", "cupcake", "milk", "egg"]
    ]

    func getAllowedFood(type: FastingType) -> [String] {
        return allowedFood[type]!
    }
}
变化:

  • 给了
    allowedFood
    类型
    [FastingType:[String]]]
    ,以便它可以解释您的枚举值
  • getAllowedFood()
    提供了返回类型
  • 展开字典查找,因为它们总是返回可选项

  • 或者,您可以使用
    getAllowedFood()
    to
    returnallowedFood[type]??[]
    如果你的字典不是详尽无遗的,那会更安全。

    永远不要在操场上测试。(我知道这是苹果公司所说的,但不要这么做。)如果你只是在一个真正的应用程序中而不是在一个游乐场中这样做,编译器会给你清晰的错误信息。哦,还有一条建议。当然,Swift或Cocoa中可能存在错误,但除非您首先了解到当事情出错时,是您做错了什么,否则您将无法学习编程。如果我做错了什么,编译器应该显示错误消息,而不是无限循环!Matt的建议是务实的,但是是的,编译本质上应该是确定性的,即使在操场上也不能无限循环。或者你可以在getAllowedFood中使用switch语句来避免
    感谢您“修复”我的代码。不过,我想问一个不同的问题:为什么原始代码使编译器无限循环?我想你肯定可以称之为bug。斯威夫特似乎很难解释你的字典。给字典一个显式类型来“帮助”编译器通常是个好主意。请注意,只需将
    .NoFast
    更改为
    FastingType.NoFast
    即可停止无限循环行为,因为它假定所有其他键也必须是
    FastingType
    。谢谢,vacawama!我将您的答案标记为解决方案:-)