【发布时间】:2019-04-16 15:45:41
【问题描述】:
我有一个名为 Setting 的类型,它采用这样的泛型类型参数:
Setting<T>
每个设置都包含一个值,可以是 Int32、String、Bool 或自定义对象类型等。以下是设置的一些完整实现:
class Setting<T> {
var key:String?
var defaultValue:T?
//...
}
这一切都可以按预期使用各种类型参数,但是,现在需要一个包含多个 Setting 对象的集合,这些对象可能具有各种类型参数。当我声明一个[Setting] 类型的数组变量时,显然编译器需要一个在运行时未知的类型。
我尝试在可用于泛型类型参数的类型上使用协议和扩展,例如:
protocol SettingProtocol {
func getType() -> Self.Type
}
extension Int32:SettingProtocol {
func getType() -> Int32.Type {
return Int32.self
}
}
extension String:SettingProtocol {
func getType() -> String.Type {
return String.self
}
}
//...
并将我的数组声明为
var settings = [Setting<SettingProtocol>]()
但是当我尝试将Setting 实例附加到数组时,这不起作用:
var newSetting = Setting<String>()
newSetting.setDefaultValue(value: "SomeString")
settings?.append(newSetting) // compile error here
并导致以下编译器错误:
Cannot convert value of type 'Setting<String>' to expected argument type 'Setting<SettingProtocol>'
此外,使用协议/扩展路由可能需要对在构建这些看起来非常笨重的对象时可能遇到的每种类型进行扩展。
我觉得应该有办法做到这一点。也希望当我将这些项目从数组中拉出时,我可以避免大量的类型检查。
谁能给点建议?
【问题讨论】: