斯威夫特:'!'的区别和 '?'迅速
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()方法中初始化这个变量的值。
【讨论】:
以上是关于斯威夫特:'!'的区别和 '?'迅速的主要内容,如果未能解决你的问题,请参考以下文章