如何在 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 类型的变量的主要内容,如果未能解决你的问题,请参考以下文章

NSLayout 约束失败

Swift 中的扩展属性冲突子类声明

使用 NSLayout 以编程方式向 UILabel 添加约束

扩展中的延迟加载属性(Swift)

我如何实现Swift的Comparable协议?

在 Swift 中声明具有类型约束的属性