У меня возникла проблема с компиляцией тестов в Swift. Похоже, что компилятор теряет информацию о типе шаблона, но другие общие методы работают нормально. Что мне не хватает?Функция swift generic не компилируется при тестировании
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)'
}
}
Update
MatchNormElement является протоколом, поэтому я изменил его к конкретному типу. Теперь это работает.
func testMatchNorm1() {
var list = [Measurment]()
// works fine
let ll = MatchNorm.resolve1(list, lti: LinearTransformation(1), accuracy: 0.001)
}
Я заменил 'MatchNormElement' и' LinearTransformation' на 'NSString' (и удалил' resol2', этот метод не нужен для поиска), и ошибок компиляции нет. Возможно, эта информация поможет вам. –
Спасибо ShadowOf. MatchNormElement - это протокол. И это похоже, что список должен иметь конкретные типы. –