【发布时间】:2018-09-04 16:31:43
【问题描述】:
我想以某种方式实现主题,即功能可以将其所需的颜色添加到主题协议中,因此任何实际的主题实现都必须为每个功能提供颜色。我还希望将主题实现和功能主题要求放在单独的文件中。如果我将主题或功能移动到另一个项目中,我不想手动删除代码行。
import UIKit
protocol Theme {
static var genericColor: UIColor { get }
}
protocol FeatureTheme {
static var featureColor: UIColor { get }
}
extension Theme {
static var feature: FeatureTheme.Type! {
return nil
}
}
struct LightTheme: Theme {
static var genericColor: UIColor { return .white }
static var feature: FeatureTheme.Type! { return Feature.self }
struct Feature: FeatureTheme {
static var featureColor: UIColor { return UIColor.red }
}
}
let currentTheme: Theme.Type = LightTheme.self
print(currentTheme) // LightTheme
print(currentTheme.feature.featureColor) // error, because feature is nil
所以,我想通过扩展将 FeatureTheme 要求添加到 Theme 协议中。 Swift 希望在协议扩展中看到默认实现。我想在实际的 LightTheme 实现中“覆盖”它,但这不起作用。该属性仍然返回零。我该如何解决这个问题?
【问题讨论】:
-
静态属性不能被覆盖。
-
@usako_lynn 在这种情况下没有静态问题:)
标签: swift protocols swift-extensions computed-properties