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

Swift 为什么将带有nil的强制uwrapped类型传递给具有可选类型的函数参数时不会崩溃?,swift,swift3,Swift,Swift3,我不明白为什么类型系统让我这么做 换句话说,当foo被传递到函数时,我希望它会崩溃 var foo:String! func someFunction(_ bar:String?) { print("-- \(bar) --") } someFunction(foo) => writes "-- nil --" 在someFunction中,您正在打印可选的not字符串。这就是为什么它没有崩溃。如果要将条形图打印为字符串,则必须将该值展开。如@Hamish所示,请正确指出:

我不明白为什么类型系统让我这么做

换句话说,当foo被传递到函数时,我希望它会崩溃

var foo:String!

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

someFunction(foo)

=> writes "-- nil --"

someFunction
中,您正在打印可选的not字符串。这就是为什么它没有崩溃。如果要将条形图打印为
字符串
,则必须将该值展开。

如@Hamish所示,请正确指出:
// 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)

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

对答案的评论解释了为什么会提出这个问题:

如果你不得不使用IUO还不够糟糕,那么现在它们就没那么有用了,而且行为自相矛盾。如果我使用一个,那是因为我想隐式地打开它。从现在起,它们应该被称为薛定谔期权安德烈亚斯


相关:–。在Swift 3中,如果IUO可以作为强选项进行类型检查,它们将被选中。@Hamish你能将其作为答案发布吗?同样相关:。不同的问题相同的答案。@Hamish:对不起,我在电话上读到了,没有注意到有两个链接:)我投票关闭了这个问题,因为可能会重复,我建议你关闭它:)我想这不是OP所问的,而是他为什么要这么做?