【发布时间】:2016-11-18 09:14:37
【问题描述】:
注意:类似的问题涉及 SDK 通用函数。这个是关于自写泛型函数的。
我有这个通用函数
extension Array {
func findObject<T: Identifiable>(withID objectID: Int) -> (index: Int, object: T)? {
for (index, object) in self.enumerated() {
if let identifiableObject = object as? T {
if identifiableObject.id == objectID {
return (index, identifiableObject)
}
}
}
return nil
}
}
Identifiable 协议只要求对象具有参数id ({get set})。
在代码中我有这个函数的几种用法,都是这样的
typealias ObjectInfo = (index: Int, object: SomeObject)
func deleteSomething(withID someID: Int) {
guard let objectInfo: ObjectInfo = someArray.findObject(withID: someID) else {
return
}
// some code
...
}
这段代码可以编译并正常工作。
但是当我尝试为扩展编写单元测试并尝试在测试中使用它时,问题就出现了。这是测试片段:
@testable import WhatEverTarget
typealias ObjectInfo = (index: Int, object: IdentifiableMock)
...
var array: [IdentifiableMock]!
...
let targetID = 4
let objectInfo: ObjectInfo = array.findObject(withID: targetID)
IdentifiableMock 只是一个具有id 的简单类,仅此而已。
这个测试片段无法编译,给我错误(在最后一行):
“没有“findObject”候选项产生预期的上下文结果类型 'ObjectInfo (aka '(index: Int, object: IdentifiableObject)')'”
请帮我找出这种不一致的原因。
【问题讨论】:
-
您的返回类型不匹配。 findObject 返回一个可选值,但您将其分配给非可选值。要么删除
: ObjectInfo并让 Swift 推断类型,要么添加一个 ?
标签: ios iphone swift generics swift3