【问题标题】:How do i declare a variable of type NSLayoutConstraint in an extension in swift如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量
【发布时间】: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

}

我有这个错误扩展可能不包含所有五个变量的存储属性。

【问题讨论】:

  • 您不能使用新的实例变量扩展现有类型。如果您的库为您提供了一个对象(具有一定的内存布局,用于存储属性),但您的代码期望这些新的实例方法,它们应该来自哪里?它们将存储在哪里?

标签: ios swift uiviewcontroller nslayoutconstraint


【解决方案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 我已经编辑了我的问题可能是你可以得到清晰的图片。谢谢
    • 他想在扩展中创建属性这个例子是我们可以创建的。
    猜你喜欢
    • 2019-10-15
    • 2023-03-22
    • 2012-05-05
    • 2016-12-23
    • 2017-02-12
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多