在Swift中如何使用可继承的@IBInspectable变量?

5
假设我在一个基础的@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
}
}

问题:是否有简写语法可以实现这个操作?

(如果没有,并且其他人也喜欢这个想法,我可能会为苹果的魔法师们提出一份报告.)


5
听起来像是将问题报告给苹果公司的好方法。 - rickster
如果您只提供属性观察器(例如空的'didSet'),它是否有效? - rickster
@rickster,哦,谢谢,我不知道我可以省略getter和setter。这已经更好了! - ilya n.
@rickster,实际上不是这样的,现在它抱怨基本变量未初始化,我进一步尝试的努力大多以编译器崩溃告终。 - ilya n.
好的,那么就这样吧,好奇心已经满足了。 :) - rickster
1个回答

0

注意:从Xcode 6 beta 3开始,这个问题已经被解决了:Interface Builder也可以看到超类中的可检查属性

在苹果论坛上有一个问题与此问题相关。

对于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
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接