2016-11-18 53 views
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 )')'「

請幫我找出這種不一致的原因。

+1

您的返回類型不匹配。 findObject返回一個可選項,但你將它分配給一個非可選項。除去':ObjectInfo'並讓Swift推斷這個類型或者添加一個? – Paulw11

回答

1

正如Paulw11在評論中所建議的,我需要添加可選性(?)。這有幫助。萬分感謝。

一如既往,只是一個簡單的細節,被遺忘,「寵壞」了代碼。 我想,我錯過它的原因是因爲在工作代碼中沒有選擇權,但自從guard-陳述以來並不需要。

相關問題