gpt4 book ai didi

swift - 如何在 Swift 中覆盖协议(protocol)扩展的计算属性

转载 作者:可可西里 更新时间:2023-11-01 00:55:34 25 4
gpt4 key购买 nike

我想以某种方式实现主题化,即功能可以将其所需的颜色添加到主题协议(protocol)中,这样任何实际的主题实现都必须为每个功能提供颜色。我还希望将主题实现和功能主题要求放在单独的文件中。如果我将主题或功能移动到另一个项目中,我不想手动删除代码行。

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 协议(protocol)中。 Swift 希望在协议(protocol)扩展中看到默认实现。我想在实际的 LightTheme 实现中“覆盖”它,但这不起作用。该属性仍然返回零。我该如何解决这个问题?

最佳答案

你做的是正确的,但如果你观察你的代码

let currentTheme: Theme.Type = LightTheme.self

currentThemeTheme 的类型,但是您已经分配了 LightTheme 现在是 Theme 并且在您的协议(protocol)中

extension Theme {
static var feature: FeatureTheme.Type! {
return nil
}
}

你有 nil 作为默认执行返回,因为 currentThemeTheme 类型不是 LightTheme 并且它也不需要正确

使用当前的实现解决方案也很简单,就是将 currentTheme 声明为 LightTheme 请参见下面的答案

let currentTheme: LightTheme.Type = LightTheme.self

保持 currentTheme 简单地分配 LightTheme 如下所示

let currentTheme  = LightTheme.self

希望对你有帮助

Output :

LightThemeUIExtendedSRGBColorSpace 1 0 0 1

关于swift - 如何在 Swift 中覆盖协议(protocol)扩展的计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49492999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com