以下是有效的代码:
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?
当你正在使用as上溯造型result到aParticipant你的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)
但是,如果AParticipant是results数组中元素的超类类型(如Alexander Momchliov所述),则可以将其简化为:
let newArray = results as [AParticipant]
Run Code Online (Sandbox Code Playgroud)
map但是,协议类型需要显式的,因为它们具有不同的内存结构,因此每个元素都需要单独转换。有关更多信息,请参阅此问答和本问答。
还要注意,根据《Swift API设计指南》,我已经大写了AParticipant,因为类型应该是大写。UpperCamelCase
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |