【发布时间】:2019-08-28 04:35:04
【问题描述】:
UIView 的实例是否可以调用执行闭包的方法,并在该闭包内部引用同一个实例?这是非通用版本:
import UIKit
public extension UIView {
func layout(from: (UIView) -> ()) {
from(self)
}
}
例如,当我使用 UILabel 调用它时,我无法访问例如文本对齐。是否有可能在闭包内我可以参考 UILabel?我希望这样的事情会起作用:
func layout(from: (Self) -> ()) {
from(self)
}
但它不能编译。有解决方法吗?这就是我想要的:
let label = UILabel(frame: .zero)
label.layout { $0.textAlignment = .natural } // Currenly not working, since $0 = UIView.
【问题讨论】:
-
为什么不直接使用
label而不是$0? -
@MoAbdul-Hameed 这是一个更大的简化版本,所以不要介意实际代码:)
-
func layout<T>(from: (T) -> ()) where T == Self有效吗? -
@Alexander 不,它不会编译
-
请参阅stackoverflow.com/a/42356615/2976878 - 您目前可以使用协议扩展来解决此限制,直到它被实施 (SR-10121)。