我有一个名为Foo的枚举字符串。
我有一个名为MyStruct的结构,它有一个可选的Foo实例,我希望它最初是nil。
MyStruct也有一个可用的初始化程序。
问题:当我使MyStruct同时具有可用的初始化器和可选的Foo实例时,我的构建将失败并且我得到"分段错误:11。"
将MyStruct重命名为MyClass并将其类型更改为类时没有问题。
有没有人可以告诉我为什么我不能同时使用可用的初始值设定项和在结构中初始化为nil的可选枚举?
import Foundation
enum Foo: String {
case Bla = "blabla"
}
public struct MyStruct {
var myEnum: Foo?
public init?() {}
}
var myStruct = MyStruct()
if let myEnum = myStruct?.myEnum {
println("myEnum is not nil => \(myEnum.rawValue)")
} else {
println("myEnum is nil")
}
答案 0 :(得分:2)
崩溃来自您的空init?()
方法。它是一个编译器错误,你应该打开它的雷达。问题在于,这个功能实际上无法实现失败,而Swift并不喜欢这样。以下将编译(例如,如果ignoreme
是Bool,则仍然会崩溃):
var ignoreme = 0
public struct MyStruct {
var myEnum: Foo?
public init?() {
if ignoreme != 0 { return nil }
}
}
有时(但并非总是),当init?()
没有实际的失败案例时,编译器会感到困惑。