我已经为UIViewController创建了一个扩展,我想声明一些可以在整个扩展中使用的变量。下面是我的代码
extension UIViewController {
var mssgTopConstraint1: NSLayoutConstraint?
var mssgTopConstraint2: NSLayoutConstraint?
var mssgIconTop1: NSLayoutConstraint?
var mssgIconTop2: NSLayoutConstraint?
var isCheviClicked: Bool = false
}
我有此错误扩展名,可能不包含所有五个变量的存储属性。
答案 0 :(得分:2)
错误非常明显,您不能在扩展中添加存储的属性,只能使用计算的属性。
您可以继承UIViewController
的子类,并在自定义类中声明这些属性:
class MyViewController: UIViewController {
var mssgTopConstraint1: NSLayoutConstraint?
var mssgTopConstraint2: NSLayoutConstraint?
var mssgIconTop1: NSLayoutConstraint?
var mssgIconTop2: NSLayoutConstraint?
var isCheviClicked: Bool = false
}
这是一种更干净的方法,因为用这些属性扩展UIViewController
并没有太大意义,因为并非所有控制器都需要这些属性。
您可以实例化此新控制器,或将XIB / Storyboard中的类名称设置为MyViewController
。这样,您可以使用新的控制器和新声明的属性。
答案 1 :(得分:0)
在将变量声明为扩展名时,不要直接实现getter和setter方法,而必须创建一个holder,否则将在此处创建保留循环。
extension UIViewController {
struct Holder {
static var contraint: NSLayoutConstraint = NSLayoutConstraint()
}
var actualVariable: NSLayoutConstraint {
get {
return Holder.contraint
}
set {
Holder.contraint = newValue
}
}
}
快乐编码