необязательная переменная в определении класса

необязательные параметры в определении класса

У меня есть «мастер-модель», от которой унаследовано большинство моих моделей, поэтому они могут иметь константы конфигурации.

class MasterModel {

    static let apiKey = (drop.config["app","thinx-api-key"]?.string)!
    static let baseURL = (drop.config["app","base-URL"]?.string )!

}

Обратите внимание на принудительное развертывание :(

Операторы защиты разрешены только в функциях, но не в определении класса. Как правильно определять эти константы с перехватом ошибок?


person Glenn    schedule 28.04.2017    source источник
comment
Вы в основном застряли, делая это, пока хотите, чтобы они оставались статичными. Альтернатива - сделать их нестатическими вычисляемыми свойствами и делать все, что вы хотите, в получателе.   -  person i_am_jorf    schedule 28.04.2017
comment
Принудительное разворачивание - не всегда зло. Если пути конфигурации thinx-api-key и base-URL жестко запрограммированы, просто принудительно разверните дополнительные параметры. В этом случае отсутствие ключа означает ошибку дизайна. Или добавьте где-нибудь assert строк.   -  person vadian    schedule 28.04.2017
comment
@vadian Согласен. В этом случае возможно использование ?? "".   -  person Sulthan    schedule 29.04.2017
comment
@Sulthan Нет, используйте ! и разверните необязательное. Меня очень беспокоит черно-белое предложение Никогда не принудительно разворачивать опции, это зло. Всегда используйте необязательные привязки. Существует большая разница между потенциальной ошибкой времени выполнения и ошибкой проекта. Если вы собираетесь получить доступ к файлу в пакете приложений, используйте !. Если вы собираетесь преобразовать ячейку табличного представления в настраиваемый класс, используйте !. Если вы извлекаете определенный компонент даты из даты, используйте !. В этих случаях сбой приветствуется, потому что он указывает на ошибку проектирования, которая не должна происходить.   -  person vadian    schedule 29.04.2017
comment
@vadian Полностью согласен с вами. Я бы также использовал ! в этом случае. Я предлагаю только ?? "" как потенциальную альтернативу.   -  person Sulthan    schedule 29.04.2017


Ответы (2)


Вы можете назначить им вычисленное закрытие для обнаружения ошибки конфигурации.

class MasterModel 
{

  static let apiKey:String  = { 
     if let result = drop.config["app","thinx-api-key"]?.string 
     { return result }
     print("MasterModel.apiKey error, missing app/thinx-api-key")
     return ""
  }()  // the () here makes the closure execute and return the value

  // ...
}
person Alain T.    schedule 28.04.2017

Если вам нравится, что ваша программа вылетает, только если вы действительно используете свойство, вы можете использовать вычисленное / ленивое:

class MasterModel {

    static var apiKey: String {
        get {
            return drop.config["app","thinx-api-key"]?.string)!
        }
    }
    ...

}

Это может быть полезно в случае, если статический инициализатор вызывается до того, как drop был успешно инициализирован.

person Max    schedule 29.04.2017