通用功能在同一环境中表现不同

时间:2016-11-18 09:14:38

标签: ios iphone swift generics swift3

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)')'”

请帮我找出造成这种不一致的原因。

1 个答案:

答案 0 :(得分:1)

正如Paulw11在评论中所建议的,我需要添加选项(?)。这有帮助。非常感谢你。

与往常一样,只是一个简单的细节,被遗忘,“宠坏”了代码。 我想,我错过它的原因是因为在工作代码中没有选项,但是自{{1}} - 语句以来它不是必需的。