【发布时间】:2018-04-12 09:15:50
【问题描述】:
protocol Typographable {
func setTypography(_ typography: Typography)
}
extension UILabel: Typographable {}
extension Typographable where Self == UILabel {
func setTypography(_ typography: Typography) {
self.font = typography.font
self.textColor = typography.textColor
self.textAlignment = typography.textAlignment
self.numberOfLines = typography.numberOfLines
}
}
我已经创建了一个协议Typographable,UILabel实现了这个协议,实现在extension Typographable where Self == UILabel中。
它在 swift 4.0 中完美运行,但在 swift 4.1 中不再运行,错误消息为Type 'UILabel' does not conform to protocol 'Typographable'
我已经仔细阅读了swift 4.1的CHANGELOG,但是我找不到任何有用的东西。
这正常吗,我错过了什么吗?
【问题讨论】:
-
为什么不简单地
extension UILabel: Typographable { ... } -
@MartinR 因为我有另一个
XXLabel,它有不同的setTypography实现。如果我使用extension UILabel: Typographable { ... },我必须写类似if self is XXLabel的东西,这并不优雅。 -
我目前没有解释(我无法验证 Swift 4.0 中的行为是否不同),但
extension Typographable where Self: UILabel { ... }会使其编译 -
我可以确认您的方法适用于 Swift 4 (Xcode 9.2),但不适用于 Swift 4.1。
-
@JIEWANG
XXLabel是否继承自UILabel?在这种情况下,请注意,当您将UILabel与Typographable一致时,动态调度到setTypography(在协议类型值上调用时)将调度到UILabel扩展,而不是Typographable。所以你的方法也不会在 Swift 4.0.3 中完全奏效。