如何使用和在何处使用"?"和"!"在斯威夫特

时间:2014-09-15 13:20:41

标签: swift ios8 xcode6

在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

有人可以帮我简要介绍一下吗?提前致谢

1 个答案:

答案 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;。我已经编辑了答案。)