【问题标题】:Inheritable @IBInspectable var in Swift?Swift中的可继承@IBInspectable var?
【发布时间】:2014-07-01 17:54:01
【问题描述】:

假设我在@IBDesignable 基类中创建了一个@IBInspectable 变量

现在,该属性不会使该属性在派生类中可检查。这显然是设计使然——您希望能够创建一个派生类,该类根据自己的逻辑设置基本属性并禁止用户触摸它们。

但是,假设我想让相同的属性在派生类中可检查。问题是,@IBInspectable 仅与变量定义一起使用,所以它似乎需要我重新定义变量,即使已经提供了定义(这就是我想念 Objective-C 的地方:你可以更改类接口而不接触实施前提是您知道自己在做什么)。

这有以下缺点:您不能覆盖基本存储变量,并且需要提供显式的 getter 和 setter。因此,我想出的最干净的代码是这样的:

// derived class
@IBInspectable override var borderWidth: CGFloat {
get {
    return super.borderWidth
}
set {
    super.borderWidth = newValue
}
}

// base class
@IBInspectable var borderWidth: CGFloat {
set {
    layer.borderWidth = newValue
    // this can be a very complicated setter, of course
}
get {
    return layer.borderWidth
    // this can be a very complicated getter, of course
}
}

问题:有没有一种速记语法可以做到这一点?

(如果不是,并且如果其他人喜欢这个想法,我可能会为 Apple 的魔术师提供雷达。)

【问题讨论】:

  • 听起来像a great radar to file
  • 如果你只提供一个属性观察者(例如空的didSet),它是否工作?
  • @rickster,哦,谢谢,不知道我可以省略 getter 和 setter。那已经更好了!
  • @rickster,实际上没有,现在它抱怨基本变量未初始化,我在进一步实验中的尝试大多以编译器崩溃告终。
  • 好吧,那好奇心就到此为止了。 :)

标签: xcode swift


【解决方案1】:

注意:从 Xcode 6 beta 3 开始,此问题已修复:Interface Builder 还可以在超类中查看可检查的属性

Apple 论坛中有一个question 与此问题相关。

对于 Xcode 6 beta 2 及以下版本:使用 didSet 缩短代码如下,它应该可以工作:

// derived class
@IBInspectable override var borderWidth: CGFloat { didSet{} }

// base class
@IBInspectable var borderWidth: CGFloat {
set {
    layer.borderWidth = newValue
    // this can be a very complicated setter, of course
}
get {
    return layer.borderWidth
    // this can be a very complicated getter, of course
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 2017-08-22
    • 2017-11-24
    • 1970-01-01
    • 2018-09-19
    • 2020-03-18
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多