2016-08-04 38 views
0

下面是工作代碼:地圖功能重鑄數組

let aProvider:() -> [aParticipant] = { 
    let results = fetchRequestController.fetchedObjects as! [ParticipantFetchResultsProtocol] 

    var newArray: Array<aParticipant> = Array() 
    for result in results { 
     let obj = result as aParticipant 
     newArray.append(obj) 
    } 

    return newArray 
} 

配圖我想:

我得到一個錯誤:aParticipant cannot be constructed because it has no accessible initializers

有沒有一種辦法用map完成這個?

+0

@Hamish工作!謝謝。 – user1107173

+0

沒問題:)我把它作爲下面的答案發布。 – Hamish

回答

4

當你使用as上溯造型resultaParticipantfor循環,你可以簡單地做同樣的map。假設AParticipant是一種協議(聽起來像是你得到錯誤的情況下),你只是想:

let newArray = results.map { $0 as AParticipant } 

或者你可以讓斯威夫特推斷向上轉型:

let newArray : [AParticipant] = results.map { $0 } 

但是,如果AParticipant是一種超輸入您的results數組中的元素,如Alexander Momchliov票據的,可以簡化這歸因於:

let newArray = results as [AParticipant] 

但協議類型需要明確的map,因爲它們具有不同的存儲器結構,因此每個元素都需要單獨轉換。請參閱this Q&Athis Q&A瞭解更多信息。

另請注意,我已將大寫AParticipant,因爲類型應該是UpperCamelCase - 按照Swift API Design Guidelines

+2

這不是'as as [AParticipant]'可以工作的情況嗎? – Alexander

+1

@AlexanderMomchliov取決於什麼'AParticipant'是 - 如果它是一個協議,那麼它不需要'map',因爲抽象類型具有不同的內存結構,所以需要O(n)行走來投射每個單獨的元素。如果它只是一個超類,那麼你確實是對的,這可以由數組隱式地處理,我會更新我的答案來注意這一點。 – Hamish

+1

啊,是的,這就是我懷疑的。說實話,我總是試試看,看看編譯器是否對我大喊,然後映射:p – Alexander

0

實際上,你可以摺疊功能變成一個班輪:

回報fetchRequestController.fetchedObjects.map {$ 0作爲!參與者}