问题描述
问题
我的目标是以某种方式初始化一个与此类似的通用对象:
struct SomeStruct<A,B> where A: View,B: View {
let a: A?
let b: B?
init(a: A? = nil,b: B? = nil) {
self.a = a
self.b = b
}
}
let someStruct: SomeStruct = .init(a: Color.red)
但是,此代码段会引发错误:
Generic Parameter 'B' Couldn't Be Inferred
替代方案 #1:钻石符号
另一种方法是在菱形符号中指定 Never
类型:
let someStruct: SomeStruct<Color,Never> = .init(a: Color.red)
但这是一个笨拙的解决方案,因为我不想显式传递类型。
替代方案 #2:约束初始化器
另一种冗长的替代方法是编写自定义初始值设定项,通过指定 Never
类型来省略每种类型:
struct SomeStruct<A,B: View {
let a: A?
let b: B?
}
extension SomeStruct where A == Never {
init(b: B) {
self.a = nil
self.b = b
}
}
extension SomeStruct where B == Never {
init(a: A) {
self.a = a
self.b = nil
}
}
extension SomeStruct where A == Never,B == Never {
init() {
self.a = nil
self.b = nil
}
}
let someStruct: SomeStruct = .init(a: Color.red)
但是正如你所看到的,这需要大量重复的代码。因此,如果我有一个包含 10 个泛型类型的对象,这可能会变得一团糟。
问题
简而言之,我正在寻找一种方法来保留一个简单的初始化程序,如问题部分所示。有没有办法为参数 (Never
) 提供默认类型,因为您通常会为该参数提供默认值?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)