Создать закрытие Swift для создания UIView - PullRequest
3 голосов
/ 22 октября 2019

Я хотел бы применить DRY к строкам, которые я создаю в swift. Как я могу реорганизовать этот код так, чтобы называлось замыкание? Он находится на viewcontroller.

var topLineView: UIView = {
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}()

var bottomLineView: UIView = {
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}()

var centerLineView: UIView = {
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}()

Я пытался создать переменную, но это вызвало ошибку:

let lineView = {
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}

var centerLineView = lineView()

ошибка (невозможно определить тип закрытия и т. Д.)

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

Swift не может определить тип возврата вашего закрытия, поэтому вам нужно заранее сообщить ему, что вы возвращаете UIView. Это компилируется и работает нормально.

let lineView = { () -> UIView in
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}
var myViewFromClosure = lineView()
var myViewFromClosure2 = lineView()
var myViewFromClosure3 = lineView()

Я лично выбрал бы function вместо closure в этом случае, однако. Как это:

func lineViewFunc() -> UIView {
    let lineView = UIView()
    lineView.layer.borderWidth = 1.0
    lineView.layer.borderColor = UIColor.lightGray.cgColor
    return lineView
}

var myViewFromFunc = lineViewFunc()
var myViewFromFunc2 = lineViewFunc()
var myViewFromFunc3 = lineViewFunc()
0 голосов
/ 23 октября 2019

Проблема с функцией заключается в том, что я должен вызывать ее до super.init, но self еще не существует.

...