在Swift中,为什么我必须强制用一个声明的unwrap选项?在三元表达式中使用它们之前?

时间:2017-04-12 21:37:28

标签: swift segmentation-fault optional ternary

此代码不起作用。它会导致分段错误。用变量初始化变量的全部内容!代替 ?是这样我可以使用它自动解开自己。为什么会这样?

var isFoo: Bool!

override func viewDidLoad() {
    super.viewDidLoad()
    isFoo = true
    print(getNumber())
}

func getNumber() -> Int {
    return isFoo ? 1 : 0
}

相反,我必须写:

func getNumber() -> Int {
    return isFoo! ? 1 : 0
}

最令人讨厌的是编译器只会给我一个Segmentation故障:11,它让我调试了一个多小时,得出结论这是引入错误的地方。在我尝试编译之前,它没有认识到代码有什么问题。我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

最小的工作示例。

这给了我现在的问题:

var isFoo: Bool?

func getNumber() -> Int {
    return isFoo! ? 1 : 0
}

isFoo = true
print(getNumber())

这使编译器与消息While emitting SIL for 'getNumber'(也崩溃的SourceKit)崩溃了:

var isFoo: Bool!

func getNumber() -> Int {
    return isFoo ? 1 : 0
}

isFoo = true
print(getNumber())

对我来说看起来像编译器错误。看起来像此提案中引入的错误:Abolish ImplicitlyUnwrappedOptional type

答案 1 :(得分:-2)

我在操场上试了这个,它也在那里坠毁了。有趣的是,Playground实际上让我提交错误报告!我将... ...

现在,几个月后,我收到Apple的回复,要求我使用最新的XCode 9.3 Beta进行测试。我做到了,这个错误似乎已得到解决。