2016-03-14 2 views
0

У меня есть пользовательский класс, этот подкласс UITableViewController или UIViewController. И там я получаю сообщение об ошибке, что каждое значение должно быть инициализировано при вызове super.init. Для меня решение - установить значение для каждого свойства/переменной, но почему я просто не могу оставить его просто инициализированным без какой-либо ценности? И что мне лучше делать в этой ситуации?SubClass UITableViewController и инициализация переменных. iOS, SWIFT

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

Если вы объявляете свои свойства, как это:

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! 

Позвольте мне знать, если что-то остается неясным.

+0

Итак, я могу использовать "!" суффикс, только если я на 100% уверен, что все будет хорошо, и каждая переменная получит свое значение, поняла его. И единственный способ сделать это безопасным - установить значение прямо так: var orderNumber: Int = 0/var statusText: String = "" и т. Д., Правильно? –

+0

Ну, не совсем понятно, что вы пытаетесь сделать, но давайте представим себе этот сценарий: вы запускаете 'TableViewController' и еще не имеете данных (например, вы установите свойства в' viewDidLoad' или в какой-то момент после вашей инициализации), вам придется объявить свои свойства с помощью '!'потому что компилятор просто действительно ожидает, что эти значения будут установлены, если вы не используете'! 'или'? '(необязательное значение). –

+0

@critic Благодарим вас за помощь. Могу ли я попросить еще одну вещь? Почему нам еще нужно инициализировать наши переменные в некоторых классах, если мы можем просто установить его как необязательный и оставить без init()? –

Смежные вопросы