我有一个自定义类,即子类UITableViewController或UIViewController。在那里我得到一个错误,每个值都应该在super.init调用时被初始化。对我来说,解决方案是为每个属性/变量设置一个值,但为什么我只是不能让它刚刚初始化,没有任何价值?那种情况下我应该做些什么呢?
import UIKit
import Foundation
class MSOrder: UITableViewController {
var orderId: Int
var orderNumber: Int
var statusText: String
init(orderId: Int,
orderNumber: Int,
statusText: String) {
self.orderId = orderId
self.orderNumber = orderNumber
self.statusText = statusText
super.init(style: UITableViewStyle.Plain)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
答案 0 :(得分:1)
如果您宣布您的财产如下:
class YourViewController{
var orderId: Int
var orderNumber: Int
var statusText: String
}
控制器希望它们在初始化后包含一个值,而如果你这样做:
class YourViewController{
var orderId: Int!
var orderNumber: Int!
var statusText: String!
}
您告诉编译器您在使用它们时会确保这些值包含一个值,从而绕过编译时检查。如果您知道自己在做什么(顺便说一下这并不常见),您可以使用!
后缀声明变量类型。
另一个选择是使这些属性可选:
class YourViewController{
var orderId: Int?
var orderNumber: Int?
var statusText: String?
}
这样,所有属性都被允许为nil
。
因此,在访问这些值时,您必须明确地解包它们:
self.statusText! // to get the unwrapped value of type String!
或
self.statusText?.somethingElse() // executes only if the statusText is set, otherwise continues execution of next lines
!
作为其声明的一部分的值也可以是nil
,但是通过指定!
,您可以确保在访问时具有值,而无需明确展开。
let someValue : String!
如果值为nil
:
self.someValue // if someValue is nil, this will crash!
如果你这样做:
let someValue : String?
它会继续,因为通过指定可选的?
符号,你说"嘿,我不确定,但这个值可能是零!"
因此需要打开它:
let iKnowThereIsAValueInSomeValue = self.someValue!
如果有些事情仍然不清楚,请告诉我。