2016-08-03 2 views
0

У меня есть класс скорSwift инициализации сохраняется свойство метода вне инициализации класса выпуска

class ApplicationManager { 

var fanMode: FanMode 

init() 
{ 
    self.applyDefaultSettings() 
} 

func applyDefaultSettings() 
{ 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
    self.fanMode = unwrappedFanMode 
    } 
} 

} 

Код выше бросает этот вопрос:

Use of 'self' in method call 'applyDefaultSettings' before all stored properties are initialized 

Что я должен делать здесь? Так как сообщение говорит, что мне нужно инициализировать все сохраненные свойства, прежде чем я вызову любой другой метод класса. Таким образом, это означает, что в методе init я должен инициализировать как минимум свойство fanMode. Но я хочу иметь метод, который применяет настройки по умолчанию для моих свойств для обеспечения простой читаемости и чистой архитектуры кода. Но, возможно, нормально использовать инициализатор класса для инициализации всех необходимых полей.

+0

Посмотрите, в вашем коде логическая ситуация, когда fanMode будет неинициализирован. –

ответ

3

Вы также можете сделать это с помощью этого кода:

var fanMode: FanMode = { 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
     return unwrappedFanMode 
    } else { 
     return FanMode()//some default implementation 
    } 
}() 

Это доступно для чтения, как вы хотите.

2

Согласно документации Apple, Swift не позволяет оставлять неинициализированные переменные или константы. Если вы хотите установить некоторые настройки по умолчанию, назначьте переменные с начальными значениями, которые будут действовать в качестве настроек по умолчанию, а затем вы сможете их изменить.

2

Все свойства экземпляра должны быть инициализированы в методе init. Вы можете либо переместить инициализацию в init (defaultMode будет ваше значение по умолчанию, если userDefaults равна нулю):

init() { 
    fanMode = (userDefaults?.valueForKey(Consts.kStoredFanMode) as? FanMode) ?? defaultMode 
} 

установить значение по умолчанию для этого свойства, например:

var fanMode: FanMode = defaultMode 

Или вы можете сделать свой fanMode Nullable:

var fanMode: FanMode? = nil 
3

Вы можете использовать неявность, не развернутую дополнительно. Просто добавьте ! в объявление переменной.

class ApplicationManager { 

var fanMode: FanMode! //Implicitly unwrapped optional. 

init() 
{ 
    self.applyDefaultSettings() 
} 

func applyDefaultSettings() 
{ 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
    self.fanMode = unwrappedFanMode 
    } 
} 

} 

В основном это трюки Xcode в говоря это «Эй, эта переменная инициализируется и значение никогда не будет нулевой». Но вы хотите быть осторожным, используя их, как если бы это оказалось нулевой, ваша программа выйдет из строя. Но в вашем случае это должно быть хорошо, поскольку вы инициализируете его в методе init, поэтому он никогда не будет равен нулю, прежде чем использовать его.

+0

В приведенном примере эта прямая инициализация, возможно, была правильным выбором, но если вы хотите, чтобы ваша функция applyDefaultSettings() зависела от параметра, переданного в функцию init, вы были бы потеряны. Ваш ответ дает правильный ответ здесь и предотвращает дублирование кода. Я действительно думал, что если бы стремительный был настолько строгим, он также должен был сделать вывод и проверить, могут ли все сохраненные свойства инициализироваться в applyDefaultSettings(). Но тогда функция может быть переоценена, а материал все равно потерпит неудачу ... Во всяком случае, хороший ответ! – Hans

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