gpt4 book ai didi

xcode - Swift 泛型函数在测试中无法编译

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

我在 Swift 中编译测试用例时遇到问题。编译器似乎正在丢失有关模板类型的信息,但其他通用方法工作正常。我错过了什么?

public class MatchNorm {

public static func resolve1<T:SequenceType where T.Generator.Element:MatchNormElement>(list: T, lti: LinearTransformation, accuracy: Double) -> LinearTransformation {
// no problem
return MatchNorm.resolve1(list, lti: lti, accuracy: accuracy)
}

public static func resolve2<T:SequenceType where T.Generator.Element:MatchNormElement>(list: T, lti: LinearTransformation, accuracy: Double) -> LinearTransformation {

for elem in list {
print(elem.x)
}
return lti
}
}
public class MatchNormTest: XCTestCase {
func testMatchNorm1() {
var list = [MatchNormElement]()

// compilation error here!
let ll = MatchNorm.resolve1(list, lti: LinearTransformation(1), accuracy: 0.001)
// MatchNormTest.swift:70:29: Cannot invoke 'resolve1' with an argument list of type '([MatchNormElement], lti: LinearTransformation, accuracy: Double)'
// MatchNormTest.swift:70:29: Expected an argument list of type '(T, lti: LinearTransformation, accuracy: Double)'
}
}

更新

MatchNormElement 是一个协议(protocol),所以我将其更改为具体类型。现在可以了。

func testMatchNorm1() {
var list = [Measurment]()

// works fine
let ll = MatchNorm.resolve1(list, lti: LinearTransformation(1), accuracy: 0.001)
}

最佳答案

这对于编译器来说是合理的。 Swift 允许将具体类型转换为基于协议(protocol)的变量赋值。

但是,Swift 不允许通过转换每个具体类型将一组具体类型转换为一组/协议(protocol)数组。这是合理的,原因如下:

假设我们已经有了这个结构:

protocol IntType {}
extension Int: IntType{}

现在让我们做显而易见的事情:

let item = 12
let item2:IntType = item

然后是肉眼可见的:这有充分的理由无法编译。

let a = [1,2,3]
let b: [IntType] = a

让我们在继续之前检查每种类型的大小:

sizeofValue(item)   //8
sizeofValue(item2) //40

数组是一个具有传染性的 8 字节内存。 Array 也是一种具有传染性的 40 字节内存。

当我们这样做时:

let b: [IntType] = a

我们本质上告诉编译器将 8 字节数组转换为 40 字节数组并存储它。现在,由于数组具有传染性,因此必须解构或重新洗牌,这是一项昂贵的任务。这会影响性能,并且显然会失去类型安全性。

编译器可以进行这种转换,但 Swift 团队有充分理由决定,如果用户想要这种类型转换,则需要明确,原因有两个:性能类型安全.

关于xcode - Swift 泛型函数在测试中无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805298/

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