Я действительно не могу последовать вашему примеру, так как я незнаком с библиотекой rlang
, но я думаю, что хорошим примером замыкания в R будет:
bucket <- function() {
n <- 1
foo <- function(x) {
assign("n", n+1, envir = parent.env(environment()))
n
}
foo
}
bar <- bucket()
, потому что bar()
является определением в функциональной среде bucket
его родительской средой является bucket
, и поэтому вы можете перенести туда некоторые данные. Каждый раз, когда вы запускаете его, вы изменяете среду bucket
:
bar()
[1] 2
bar()
[1] 3
bar()
[1] 4
В Вашем пользовательском представлении Вы должны объявить переменную для своего пользовательского слоя, не объявляйте переменную в объеме init. И просто init это однажды время, не пробуйте установленное нулевое значение и reinit
class CustomView:UIView { var customLayer:CALayer = CALayer() override func layoutSubviews() { super.layoutSubviews() // guard let _fillColor = self._fillColor else {return} initializeLayout() } private func initializeLayout() { customLayer.removeFromSuperView() customLayer.frame = layer.bounds layer.insertSubview(at:0) } }
Поскольку CALayer на iPhone не поддерживает менеджеры компоновки, я думаю, вам нужно сделать основной слой вашего представления настраиваемым подклассом CALayer, в котором вы переопределяете layoutSublayers
, чтобы установить рамки всех подслоев. Вы также должны переопределить метод вашего представления + layerClass
, чтобы вернуть класс вашего нового подкласса CALayer.
У меня была такая же проблема. В слое настраиваемого вида я добавил еще два подслоя. Чтобы изменить размер подслоев (каждый раз, когда меняются границы настраиваемого представления), я реализовал метод layoutSubviews
моего настраиваемого представления; внутри этого метода я просто обновляю фрейм каждого подслоя, чтобы он соответствовал текущим границам слоя моего подпредставления.
Примерно так:
-(void)layoutSubviews{
//keep the same origin, just update the width and height
if(sublayer1!=nil){
sublayer1.frame = self.layer.bounds;
}
}