Създайте Swift затваряне, за да създадете UIView

Бих искал да приложа 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()

грешка (не може да се изведе тип на затваряне и т.н.)


person Rik    schedule 22.10.2019    source източник


Отговори (2)


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()
person joehinkle11    schedule 22.10.2019
comment
Определено съм съгласен за функцията. Струва си да запомните, че една функция може да бъде локално вложена в друга функция и това прави добър начин за извличане на локално повтарящ се код, без да се замърсява външното пространство на имената. - person Rob Napier; 22.10.2019
comment
Опитах функция, но компилиторът се оплаква, че self не се инициализира - person Rik; 23.10.2019
comment
@Rik можете да споделите внедряването си, ако желаете - person joehinkle11; 23.10.2019
comment
В крайна сметка създадох отделен клас, защото функция няма да работи, но също така се повтарям в подобна ситуация, защото моят мениджър каза да използвам и функция, но тогава ще трябва да я направя незадължителна - person Rik; 23.10.2019
comment
Предполагам, че мога просто да създам празен и да използвам метод, за да го конфигурирам във viewdidload... - person Rik; 23.10.2019
comment
@Rik Добавих пример за функция в моя отговор - person joehinkle11; 23.10.2019
comment
Освен това в крайна сметка наистина няма значение дали използвате function или closure. Свързани: stackoverflow. com/questions/24108667/ - person joehinkle11; 23.10.2019

Проблемът с функцията е, че трябва да я извикам преди super.init, но self все още не съществува.

person Rik    schedule 23.10.2019