Как написать универсальную функцию класса Swift для инициализации классов с помощью замыкания? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь написать универсальную функцию класса для классов Swift, которая позволила бы мне инициализировать классы, используя синтаксис замыкающего замыкания.

У меня уже есть работа с конкретными классами, например, с UILabel.

// Extension for UILabel
extension UILabel {
    class func new(_ initialization: (inout UILabel) -> Void) -> UILabel {
        var label = UILabel()
        initialization(&label)
        return label
    }
}

// Initialize new UILabel using trailing closure syntax and "new" function
let label = UILabel.new {
    $0.textColor = .red
}

Однако я хочу использовать эту функциональность для всех подклассов NSObject, поэтому я пытаюсь реализовать обобщенную версию функции "new" выше.До сих пор я придумал это:

extension NSObject {
    class func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

Но это приводит к следующей ошибке: 'Self' доступна только в протоколе или как результат метода в классе;Вы имели в виду «NSObject»?

Я пробую это на игровой площадке со Swift 5.1 (Xcode 11 beta).

1 Ответ

1 голос
/ 05 июня 2019

Как сказал Хэмиш , может быть, лучше оставить init снаружи, чтобы он был более гибким.Однако может быть своего рода обходной путь для этого с использованием протокола.

protocol Initializable {
    init()
}

extension Initializable {
    static func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

extension NSObject: Initializable {}

NSObject уже имеет init, поэтому он автоматически соответствует Initializable.Затем напишите свое расширение в протоколе.

Единственное, что нужно знать, это то, что вы не можете использовать модификатор class сейчас, поскольку вы находитесь в protocol.

Не уверен, что это может привести к проблеме для модификатора NS_UNAVAILABLE, я думаю, что он может произойти сбой во время выполнения, когда вы используете его в классе, который скрывает инициализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...