我在试图理解init!()在Swift中是如何工作的。这是我的测试:

struct InitTest {
    var text: String
    init!(text: String) {
        self.text = text
    }
}

let testResult = InitTest(text: "Hello!")

据我所知,testResult应该是InitTest(unwrapped)类型,但实际上它仍然是InitTest?
那么init!()init?()有何不同?

最佳答案

InitTest(text: "Hello!")返回隐式展开的可选值,
这是一个可选的,如有必要可以打开包装。例如
无需显式展开即可访问其属性

let string = InitTest(text: "Hello!").text

或者将其传递给接受(非可选)参数的函数:
func foo(_ x: InitTest) { }
foo(InitTest(text: "Hello"))

但是任务
let testResult = InitTest(text: "Hello!")

使InitTest成为常规(“强”)选项,请参见
SE-0054 Abolish ImplicitlyUnwrappedOptional typeImplicitly unwrapped optional assign in Xcode 8
如果可以使用强可选类型显式检查表达式,则会。
实际上,我想不出定义testResult方法的好理由。

09-11 20:02