ios - 属性包装器:“不能在属性初始化程序中使用实例成员;属性初始化程序在‘self’可用之前运行”
问题描述
我正在尝试创建波纹管属性包装器
@propertyWrapper
public struct ConstraintValue {
private let view:UIView
private let contraint:NSLayoutConstraint
public init(contraint:NSLayoutConstraint,view:UIView) {
self.contraint = contraint
self.view = view
}
public var wrappedValue: CGFloat {
set {
contraint.constant = newValue
view.layoutIfNeeded()
}
get {
return contraint.constant
}
}
}
但是当我尝试使用它时,我得到“不能在属性初始化器中使用实例成员;属性初始化器在'self'可用之前运行”
@IBOutlet weak private var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue(contraint: imageViewHeightConstraint, view: self)
public var imageHeight:CGFloat
有没有办法通过这个错误?
解决方案
您不能使用self
andimageViewHeightConstraint
来初始化此属性,因为此时它不存在。
最简单的解决方案是将约束和视图传递给视图init()
方法中的包装器,如下所示:
@propertyWrapper
public struct ConstraintValue {
var view: UIView!
var constraint: NSLayoutConstraint!
public var wrappedValue: CGFloat {
set {
constraint.constant = newValue
view.layoutIfNeeded()
}
get {
return constraint.constant
}
}
}
class OurView: UIView {
var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue public var imageHeight:CGFloat
init() {
super.init(size: .zero)
_imageHeight.view = self
_imageHeight.constraint = imageViewHeightConstraint
}
}
或者,您可以使用 KeyPathimageViewHeightConstraint
并传递self
给视图中的属性包装器init()
。像这样的东西:
protocol DynamicImageView: UIView {
var imageViewHeightConstraint: NSLayoutConstraint! { get set }
}
@propertyWrapper
public struct ConstraintValue {
var view: DynamicImageView?
private let constraintKeyPath: WritableKeyPath<DynamicImageView, NSLayoutConstraint>
init(constraintKeyPath: WritableKeyPath<DynamicImageView, NSLayoutConstraint>) {
self.constraintKeyPath = constraintKeyPath
}
public var wrappedValue: CGFloat {
set {
view?[keyPath: constraintKeyPath].constant = newValue
view?.layoutIfNeeded()
}
get {
view?[keyPath: constraintKeyPath].constant ?? 0.0
}
}
}
class OurView: UIView, DynamicImageView{
var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue(constraintKeyPath: \.imageViewHeightConstraint)
public var imageHeight:CGFloat
init() {
super.init(frame: .zero)
_imageHeight.view = self
}
}
推荐阅读
- c++ - constexpr 如何推导出值?
- ruby-on-rails - Rails - 按 URL PostgreSQL 的域过滤
- javascript - 如何在数组中进行数学计算
- java - 将 MySQL 查询转换为 JPA 以获取计数
- scala - 在尾递归中等待未来完成
- hive - SemanticException [错误 10128]:第 1:33 行尚不支持 UDAF 'sum' 的位置
- html - 我们可以使用颤振将PDF转换为图像以显示文件的缩略图吗?
- excel-formula - 获取“冻结窗格”列右侧可见的第一列的列号?
- javascript - 如何从顺序键盘导航中删除 Vuetify 附加图标
- php - 匹配一个满足其他两个字符串的字符串