如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量
Posted
技术标签:
【中文标题】如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量【英文标题】:How do i declare a variable of type NSLayoutConstraint in an extension in swift 【发布时间】:2018-08-28 18:59:41 【问题描述】:我为我的 UIViewController 创建了一个扩展,我想声明一些我可以在扩展中使用的变量。下面是我的代码
extension UIViewController
var mssgTopConstraint1: NSLayoutConstraint?
var mssgTopConstraint2: NSLayoutConstraint?
var mssgIconTop1: NSLayoutConstraint?
var mssgIconTop2: NSLayoutConstraint?
var isCheviClicked: Bool = false
我有这个错误扩展可能不包含所有五个变量的存储属性。
【问题讨论】:
您不能使用新的实例变量扩展现有类型。如果您的库为您提供了一个对象(具有一定的内存布局,用于存储属性),但您的代码期望这些新的实例方法,它们应该来自哪里?它们将存储在哪里? 【参考方案1】:错误很明显,你不能在扩展中添加存储属性,你只能使用计算属性。
您可以继承 UIViewController
并在您的自定义类中声明这些属性:
class MyViewController: UIViewController
var mssgTopConstraint1: NSLayoutConstraint?
var mssgTopConstraint2: NSLayoutConstraint?
var mssgIconTop1: NSLayoutConstraint?
var mssgIconTop2: NSLayoutConstraint?
var isCheviClicked: Bool = false
这是一种更简洁的方法,因为使用这些属性扩展 UIViewController
并没有太大意义,因为并非所有控制器都需要这些属性。
你可以实例化这个新的控制器,或者将XIB/Storyboard中的类名设置为MyViewController
。这样您就可以使用新的控制器和新声明的属性。
【讨论】:
【参考方案2】:在将变量声明为扩展时不要直接实现 getter 和 setter,您必须创建一个持有者,否则它将创建一个保留循环这里是一个示例。
extension UIViewController
struct Holder
static var contraint: NSLayoutConstraint = NSLayoutConstraint()
var actualVariable: NSLayoutConstraint
get
return Holder.contraint
set
Holder.contraint = newValue
愉快的编码
【讨论】:
不能用 NSLayoutConstraint 实现这个 @chevi99 这到底是什么意思? @Alexander 我已经编辑了我的问题可能是你可以得到清晰的图片。谢谢 他想在扩展中创建属性这个例子是我们可以创建的。以上是关于如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量的主要内容,如果未能解决你的问题,请参考以下文章