“从不”类型作为多泛型初始化的默认类型 问题替代方案 #1:钻石符号替代方案 #2:约束初始化器问题

问题描述

问题

我的目标是以某种方式初始化一个与此类似的通用对象:

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 (将#修改为@)