IBOutlets和IBactions要求! 到底

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

View Controller has no initialiser

需要的init(coder aDecoder:NSCoder){fatalError(“init(coder 🙂 has not been implemented”)}

IBOutletproperty has non-optional type 'UILabel'

并不断popup这个代码:

@IBOutlet var outputLabel : UILabel

但是当我添加一个! 马克,它运行没有像这样的错误

@IBOutlet var outputLabel : UILabel!

同样的事情发生的IBActions …

首先要知道,究竟是什么!?

  • 使用? :如果这个价值在将来可能成为零,那么你为此testing。
  • 使用! :如果未来真的不应该成为零,但最初应该是零。

@IBOutlet:

当你在Swift中声明一个sockets时,编译器会自动将这个types转换成一个弱隐式解包的可选项,并赋予它一个初始值为nil值。

实际上,编译器用@IBOutlet weak var name: Type! = nilreplace@IBOutlet var name: Type @IBOutlet weak var name: Type! = nil @IBOutlet weak var name: Type! = nil

Xcode会改变它,并强制声明@IBOutlet非选项typesvariables的限制,所以下面两种types的@IBOutlet的声明是有效的,直到date。

 @IBOutlet var outputLabel : UILabel! @IBOutlet var priceLabel : UILabel? 

但是,如果您控制在testing版4中拖放标签的出口,则会发生以下情况:

 @IBOutlet var priceLabel : UILabel! = nil 

那是对的。 在Swift中,Xtypes的variables不能为零,这意味着它必须被初始化。 这意味着您必须初始化init方法或内联初始化。

一般来说,视图控制器将声明可选types的variables – 例如,

@IBOutlet var outputLabel : UILabel!

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

如果你没有使你的variables可选,你必须初始化它。 如果你不初始化内联,你必须提供一个init方法 – 因此你得到的错误。

接口生成器数据在视图控制器启动后加载,所以初始化后出口不能有值。 使用隐式解包的可选属性(在这种情况下为sockets),您承诺在启动对象后属性可能为零,但稍后(在加载笔尖或故事板之后)会分配它们的值。

由于Stack允许Q和A风格的问题,我也会把它放在简单的话中。 只要把! 在和网点的人。 非常感谢你的帮助。

错误

 'required' initialized 'init(coder:)' must be provided by subclass of 'UIViewController' 

我添加时突然开始

 var start : NSDate 

到以前工作的UIViewController的子类,否则全部在IB中完成。 改成

  var start : NSDate? 

固定。 这是一个令人惊讶的错误(编码器?),对于一个简单的编辑人来说,启动一个应用程序可能会遇到很长时间才会遇到编码器或创build他们自己的init方法,这可能有助于明确表明初始化需求不局限于IBOutlets。 上面的答案描述了根本原因。

当视图或视图控制器从界面构build器文件初始化时,它们的插口不能连接。 他们只会在初始化后连接,所以他们需要是可选的。 当初始化后调用类中的任何其他代码时,这些sockets保证连接。 这就是为什么IBOutlets总是被声明为隐含的解包选项。