斯威夫特:'!'的区别和 '?'迅速

Posted

技术标签:

【中文标题】斯威夫特:\'!\'的区别和 \'?\'迅速【英文标题】:Swift : Difference in '!' and '?' in swift斯威夫特:'!'的区别和 '?'迅速 【发布时间】:2014-09-26 06:33:43 【问题描述】:

我在下面声明:

@IBOutlet var hw_label : UILabel!

如果我按照上面的写法,它就运行成功了,

但是当我声明如下:

    @IBOutlet var hw_label : UILabel!

              and 
    hw_label.text = "Hello World"

显示错误为 Image.

我只是想知道'!'之间有什么区别和'?'。

或者为什么我们必须使用这个..?

【问题讨论】:

您是否打算让您的代码 sn-ps 包含??因为据我所知,谁都没有。 Swift variable decorations with "?" and "!" 的可能重复项 @Juhana :- 谢谢。我搜索但没有得到任何东西所以我问.. 【参考方案1】:

Swift 中有两种类型的变量。

    可选变量 普通(非可选)变量

可选变量: 最短的描述是可选变量/对象包含属性“object-returns-nil-when-non-exist”。在 objC 中,我们创建的几乎所有对象都是可选变量。那就是对象具有属性“对象返回零时不存在”行为。然而,这种特殊行为并不是一直都需要的。因此,要识别符号“?”的选项和 '!'已经用过。同样有两种类型的选项......

普通选项(?) 隐式解包选项(!)

普通选项:

var normalOptional : String?

隐式解包选项:

var specialOptional : String!

两者都具有“可选”行为,但不同之处在于“隐式展开可选”也可以用作普通(非可选)值。

例如,indexPath 变量在默认的 tableview 委托方法中声明在 function(cellForRowAtIndex) 参数列表中。调用 cellForRowAtIndex 时存在行值。在那里,indexPath 变量在函数(cellForRowAtIndex)参数列表中声明。 因此,从 'indexPath' 展开 'row' 值如下。

       var rowValue = indexPath?.row // variable rowValue inferred as optional Int value
       or
       var rowValue = indexPath!.row// variable rowValue inferred as normal Int value

注意:使用“!”时展开,必须非常确定特定类存在(包含值)。

希望这个链接能给你更多的想法。 What is the intended use of optional variable/constant in swift

【讨论】:

【参考方案2】:

?用于可选值,即如果您在声明时不知道该变量将具有值或不将其声明为可选值。 varfriendName:字符串? 在这种情况下,friendName 可以为 nil

!用于隐式展开的可选,即您确定变量必须具有值。 var employeeId:字符串! 在这种情况下,employeeId 不能为 nil

【讨论】:

【参考方案3】:

还有一件事:

如果你在一个中声明了一个!标记变量,你必须在这个类的init()方法中初始化这个变量的值。

【讨论】:

以上是关于斯威夫特:'!'的区别和 '?'迅速的主要内容,如果未能解决你的问题,请参考以下文章

SVG和SVC的区别

SVG和SVC的区别

Nginx的功能与特性

library 和 applicationSupport 目录有啥区别?

nginx和apache区别

面试-链表和数组的区别