斯威夫特:'!'的差异 和'?' 在迅速

Er.*_*hah 1 optional swift xcode6 ios8

我在下面声明:

@IBOutlet var hw_label : UILabel!
Run Code Online (Sandbox Code Playgroud)

如果我上面写的比它成功运行,

但是当我声明如下:

    @IBOutlet var hw_label : UILabel!

              and 
    hw_label.text = "Hello World"
Run Code Online (Sandbox Code Playgroud)

它显示错误为图像.错误图片

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

或者为什么我们要用这个..?

Sur*_*raj 6

Swift中有两种类型的变量.

  1. 可选变量
  2. 正常(非可选)变量

可选变量:最短的描述是可选变量/对象包含属性"object-returns-nil-when-non-exist".在objC中,我们创建的几乎所有对象都只是可选变量.也就是说,对象具有属性"object-returns-nil-when-non-exist"行为.但是,这种特殊行为并不是一直需要的.那么,要识别选项符号'?' 和'!' 已经用过.同样有两种类型的期权......

  • 正常选项(?)
  • 隐式解包的选项(!)

正常选项:

var normalOptional : String?
Run Code Online (Sandbox Code Playgroud)

隐含未解包的期权:

var specialOptional : String!
Run Code Online (Sandbox Code Playgroud)

两者都具有"可选"行为,但不同之处在于"隐式解包可选"也可以用作普通(非可选)值.

例如,indexPath变量在函数(cellForRowAtIndex)参数列表中通过默认的tableview委托方法声明.调用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
Run Code Online (Sandbox Code Playgroud)

注意:使用'!'时 展开时,必须非常确定特定的类是否存在(包含值).

希望这个链接能给你更多的想法.swift中可选变量/常量的预期用途是什么?