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