为什么在传递给具有可选类型的函数参数时,带有nil的强制uwrapped类型不会崩溃?

时间:2017-02-15 10:09:11

标签: swift swift3

我不明白为什么类型系统允许我这样做?

换句话说当foo传递给函数时,我希望这会崩溃。

var foo:String!

func someFunction(_ bar:String?) {
    print("-- \(bar) --")
}

someFunction(foo)

=> writes "-- nil --"

3 个答案:

答案 0 :(得分:2)

正如@Hamish所以正确指出: https://stackoverflow.com/a/39537558/308189

  

如果可以使用强可选类型显式地检查表达式,那么它将是。但是,如果需要,类型检查器将回退到强制可选。

答案的评论解释了为什么要问这个问题:

  

好像你不得不使用IUO一样,现在它们不那么有用并且行为矛盾。如果我使用它,因为我希望它被隐式解开。从现在开始,它们应该被称为SchrödingerOptionals。 - 安德烈亚斯

答案 1 :(得分:1)

someFunction内,您正在打印可选的非字符串。这就是它没有崩溃的原因。如果要打印条形为String,则必须打开该值。

答案 2 :(得分:0)

// This line will create variable named foo and type of it will be String! and value of it will be nil.
// It mean i can access this variable is force-wraped so it may dangerous but uses of this variable  without type checking compiler will not give any warning(ignore by compiler).
var foo:String!

// This function will accept `String` value or `nil`. 
func someFunction(_ bar:String?) {
    print("-- \(bar) --")
}

// So calling this function use of `foo`(valued nil) will not give any compiler issue.
someFunction(foo)