例如,
superview?.subviews.filter{
$0 != self &&
$0.responds(to: #selector(setter: Blueable.blue))
}.map{
($0 as! Blueable).blue = false
}
有没有类似..的概念
x.blue??? = false
“???” 意思是“如果它对蓝色有反应,就叫蓝色”......
注意 - 我非常感谢我可以编写一个扩展名callIfResponds:to
,或一个特定的扩展名,blueIfBlueable
。
我想知道这里是否有一些本地的 swiftyness,我不知道。这似乎是一个非常基本的概念。
脚注:
在随后的激烈讨论中,提到了使用协议。只是为了任何阅读的人的利益,这里是使用协议的一种方法:
protocol Blueable:class {
var blue:Bool { get set }
}
extension Blueable where Self:UIView {
func unblueAllSiblings() { // make this the only blued item
superview?.subviews.filter{$0 != self}
.flatMap{$0 as? Blueable}
.forEach{$0.blue = false}
}
}
// explanation: anything "blueable" must have a blue on/off concept.
// you get 'unblueAllSiblings' for free, which you can call from
// any blueable item to unblue all siblings (likely, if that one just became blue)
例如,要使用它...
@IBDesignable
class UILabelStarred: UILabel, Blueable {
var blueStar: UIView? = nil
let height:CGFloat = 40
let shinyness:CGFloat = 0.72
let shader:Shader = Shaders.Glossy
let s:TimeInterval = 0.35
@IBInspectable var blue:Bool = false {
didSet {
if (blue == true) { unblueAllSiblings() }
blueize()
}
}
func blueize() {
if (blueStar == nil) {
blueStar = UIView()
self.addSubview(blueStar!)
... draw, say, a blue star here
}
if (blue) {
UIView.animate(withDuration: s) {
self. blueStar!.backgroundColor = corporateBlue03
self.textColor = corporateBlue03
}
}
else {
UIView.animate(withDuration: s) {
self. blueStar!.backgroundColor = UIColor.white
self.textColor = sfBlack5
}
}
}
}
回到最初的问题,一切都很好。但是您不能“拾取”isHidden
现有类中的现有属性(一个简单的例子是 )。
此外,只要我们正在讨论它,请注意,在该示例协议扩展中,不幸的是,您不能自动拥有协议或扩展,因为它是从协议或扩展“内部”调用 unblueAllSiblings 的,原因正是:为什么你做不到