0
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
({得到設定})。 在代碼中,我有這個功能的幾個用途,都在尋找這樣的
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(又名’(指數:詮釋,對象:IdentifiableObject )')'「
請幫我找出這種不一致的原因。
您的返回類型不匹配。 findObject返回一個可選項,但你將它分配給一個非可選項。除去':ObjectInfo'並讓Swift推斷這個類型或者添加一個? – Paulw11