在Swift中使用?
和!
时,我没有发现任何差异。以下是我使用?
var myString:String? = "Ganesh";
if myString{
println(myString)
}else{
println(myString)
}
OutPut was: Optional Ganesh
var myString:String? = "Ganesh";
myString = nil
if myString{
println(myString)
}else{
println(myString)
}
OutPut was: nil
当我使用!
var myString:String! = "Ganesh";
if myString{
println(myString)
}else{
println(myString)
}
OutPut was: Ganesh
var myString:String! = "Ganesh";
myString = nil
if myString{
println(myString)
}else{
println(myString)
}
OutPut was: nil
有人可以帮我简要介绍一下吗?提前致谢
答案 0 :(得分:1)
首先,技术差异:
使用var y : String?
时,您必须使用if let x = y { /* do something with x */ }
或y!
才能使用y
中的值。 y.toInt()
无效,因为toInt()
上不存在Optional<String>
。
使用var y : String!
时,您使用的是隐式展开的可选项。当您执行y.toInt()
时,它的行为就像您说y!.toInt()
一样。这是完全不同的。
现在,用法:
如果可能,请使用变量,返回值或不属于任何选项的属性。
如果您必须有选项,请尽可能使用?
(普通期权)。这清楚地表明,可选项可能没有值,而且它是设计的结果。
当使用隐式展开的可选 - !
- 时,它表明它可能是&#34;可能&#34;应该有一个值,它通常在关于它是否应该是可选的信息时使用,例如Objective-C框架。这使得处理几乎总是更容易获得值的值(因为您不必一直键入!
),但这也意味着他们鼓励不检查{的代码{1}}因此可能会崩溃并烧毁。
Apple在导入Cocoa框架时使用隐式解包的可选项,但是他们也清理了很多自己的框架,使用普通的nil
选项或非选项而不是隐式解包的选项,因为它提供了很多关于期待什么的更多信息。
(更新2014-09-30:我完全混淆了#34;!&#34;和#34;?&#34; - &#34;?&#34;的意思更喜欢&#34;!&#34;。我已经编辑了答案。)