NB :类似的问题涉及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)')'”
请帮我找出造成这种不一致的原因。
答案 0 :(得分:1)
正如Paulw11在评论中所建议的,我需要添加选项(?)。这有帮助。非常感谢你。
与往常一样,只是一个简单的细节,被遗忘,“宠坏”了代码。 我想,我错过它的原因是因为在工作代码中没有选项,但是自{{1}} - 语句以来它不是必需的。