【问题标题】:Generic function behaving differently in the same environment通用函数在相同环境中表现不同
【发布时间】: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


【解决方案1】:

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

一如既往,只是一个简单的细节,被遗忘,“宠坏”了代码。 我想,我错过它的原因是因为在工作代码中没有可选性,但自从guard-statement 以来它就不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多