UITableViewController的SubClass和变量Initialization。 iOS,SWIFT

时间:2016-03-14 14:23:12

标签: ios swift oop cocoa-touch

我有一个自定义类,即子类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)
    }
}

1 个答案:

答案 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!

如果有些事情仍然不清楚,请告诉我。