Swift:扩展,通过此函数的所有路径都将自行调用

时间:2019-07-03 12:08:09

标签: ios swift

我警告我无法删除

  

通过此函数的所有路径都将自行调用

我的代码:

extension UIView {

    var isLowAlpha: Bool {
        get {
            return self.isLowAlpha
        }
        set {
            self.isUserInteractionEnabled = !newValue
            self.alpha = newValue ? 0.3 : 1
        }
    }

}

我无法使用此方法修改代码,因为我遇到了错误extension must not contain stored property ..

extension UIView {

    var isLowAlpha: Bool {
        didSet {
            self.isUserInteractionEnabled = !isLowAlpha
            self.alpha = isLowAlpha ? 0.3 : 1
        }
    }

}

解决方案是什么?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是还原该过程:

var isLowAlpha: Bool {
    get {
        return !isUserInteractionEnabled
    }
    set {
        isUserInteractionEnabled = !newValue
        alpha = newValue ? 0.3 : 1
    }
}

或者更好,因为您对getter不感兴趣,因此使其成为函数:

func setIsLowAlpha(_ lowAlpha: Bool) {
    self.isUserInteractionEnabled = !lowAlpha
    self.lowAlpha = newValue ? 0.3 : 1
}

无论如何,查看您的代码,您可能希望实现视图被禁用。这通常是UIControl子类的任务,而不是UIView的任务。

还请注意,可以使用包装器视图实现相同的操作:

class AlphaView: UIView {
   var isLowAlpha: Bool = false {
      didSet {
         isUserInteractionEnabled = !isLowAlpha
         alpha = isLowAlpha ? 0.3 : 1
      }
   }
}

然后将您的意见放在里面。

答案 1 :(得分:0)

在第一种情况下,您递归地调用了变量的getter,因此它将永远不会返回。解决此问题的方法是使用存储的属性_isLowAlpha,但是不幸的是,正如第二个错误所提到的,Swift扩展不能包含存储的变量。它们只能包含计算的属性。如果确实需要添加其他属性,则需要代替UIView的子类,而不是进行扩展。

但是,在这种情况下,只要您不通过直接使用alpha属性在其他地方设置UIView的alpha属性,就可以作弊:

extension UIView {
    var isLowAlpha: Bool {
        get {
            return self.alpha == 0.3;
        }
        set {
            self.alpha = newValue ? 0.3: 1
            self.isUserInteractionEnabled = !newValue
        }
    }
}