gpt4 book ai didi

swift - 使用 Swift 函数,该函数采用通用序列

转载 作者:行者123 更新时间:2023-11-30 11:17:55 25 4
gpt4 key购买 nike

我现在开始使用 swift,泛型与我习惯的有很大不同。做这样的事情的正确方法是什么?

func createThing<T, Seq: Sequence>(_ type: T.Type, _ block : @escaping (_ sequence: Seq) -> Void) where Seq.Element == T {
// ...
}

enum MyEnum {
case A
case B
}

// error: generic parameter 'Seq' could not be inferred
createThing(MyEnum.Type, { sequence in

for i in sequence{
//...
}
})

我很乐意直接使用 createThing<MyEnum>(...) 提供泛型类型参数但这显然不是 Swift 能做到的事情,而且泛型对于协议(protocol)的作用似乎与其他所有东西都大不相同。

最佳答案

SeqcreateThing 函数通用签名的一部分,这意味着编译器需要能够从调用上下文中推断出这一点,或者显式地被告知 Sequence 的具体实现应该是什么。另外,将 Sequence 泛型放在函数级别确实限制了您在该函数中可以执行的操作,因为它无法实例化协议(protocol)。

您可以将 (Seq) -> Void block 转换为 (T) -> Void block ,并将序列迭代移至 doSomething code>,这将消除编译错误。当您使用它时,您可以为 type 参数添加默认值,这将启用类型推断和自动填充该参数

func createThing<T>(_ type: T.Type = T.self, _ block: (T) -> Void) {
// ...
// assuming sequence is create above
sequence.forEach(block)
}

enum MyEnum {
case a
case b
}

// a dedicated function for processing items also means better structured code :)
func processEnum(_ value: MyEnum) {
// do your stuff
}

// you can now pass only the second argument
createThing(processEnum)

关于swift - 使用 Swift 函数,该函数采用通用序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51586695/

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