IBOutlets和IBactions需要!到底

Jul*_* E. 7 iboutlet ios swift xcode6

我今天试图从Obj-C开始到Swift,我正在阅读文档.我试图在Swift中创建一个简单的IBOutlet,它不断给我这些错误.

View Controller has no initialiser

必需的init(编码器aDecoder:NSCoder){fatalError("init(编码器:)尚未实现")}

IBOutletproperty has non-optional type 'UILabel'

并且不断弹出这段代码:

@IBOutlet var outputLabel : UILabel

但是当我添加一个!标记,它运行没有错误,如此

@IBOutlet var outputLabel : UILabel!

同样的事情发生在IBActions上......

vir*_*rus 10

首先,了解究竟是怎样!?

  • 使用?:如果将来该值变为零,那么您可以对此进行测试.
  • 使用!:如果将来确实不应该为零,但最初需要为零.

@IBOutlet:

当您在Swift中声明一个出口时,编译器会自动将该类型转换为弱隐式展开的可选项,并为其指定初始值nil.

实际上,编译器将@IBOutlet var name:Type 替换为@IBOutlet weak var name: Type! = nil.

Xcode会更改它并强制限制声明@IBOutlet 非选项类型变量,因此遵循这两种声明@IBOutlet是有效的直到日期.

@IBOutlet var outputLabel : UILabel!
@IBOutlet var priceLabel : UILabel?
Run Code Online (Sandbox Code Playgroud)

但是,如果您控制拖动beta 4标签的插座,则会发生这种情况:

@IBOutlet var priceLabel : UILabel! = nil
Run Code Online (Sandbox Code Playgroud)


Kir*_*ins 6

接口构建器数据在视图控制器启动后加载,因此在初始化后,出口不能具有值.使用隐式展开的可选属性(在这种情况下为outlet),您承诺在启动对象后属性可能为nil,但稍后将分配它们的值(在加载nib或storyboard之后).


tng*_*tng 5

那是正确的.在Swift中,X类型的变量不能为nil,这意味着它必须被初始化.这意味着您必须在init方法或内联初始化中初始化.

通常,视图控制器将声明可选类型的变量 - 例如,

@IBOutlet var outputLabel : UILabel!

这意味着您不需要初始化outputLabel,默认情况下,它的值是nil.这是IBOutlet变量的一般模式,因为变量是在init方法之外设置的.

如果不使变量可选,则必须对其进行初始化.如果不初始化内联,则必须提供init方法 - 因此会出现错误.