映射函数重铸数组

use*_*173 1 swift

以下是有效的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

使用地图,我尝试过:

var newArray = results.map({aParticipant($0)})
Run Code Online (Sandbox Code Playgroud)

我收到一个错误: aParticipant cannot be constructed because it has no accessible initializers

有没有办法做到这一点map

Ham*_*ish 5

当你正在使用as上溯造型resultaParticipant你的for循环,你可以简单地做一个相同的map。假设AParticipant是一个协议(听起来像您收到错误的情况),您只需要:

let newArray = results.map { $0 as AParticipant }
Run Code Online (Sandbox Code Playgroud)

或者,您可以让Swift推断出上行:

let newArray : [AParticipant] = results.map { $0 }
Run Code Online (Sandbox Code Playgroud)

但是,如果AParticipantresults数组中元素的超类类型(如Alexander Momchliov所述),则可以将其简化为:

let newArray = results as [AParticipant]
Run Code Online (Sandbox Code Playgroud)

map但是,协议类型需要显式的,因为它们具有不同的内存结构,因此每个元素都需要单独转换。有关更多信息,请参阅此问答本问答

还要注意,根据《Swift API设计指南》,我已经大写了AParticipant,因为类型应该是大写。UpperCamelCase

  • 这不是'作为[参与者]`可以工作的情况吗? (2认同)