我学习代码,并拥有Event对象:
typealias AnyDict = [String: Any]
class Event {
let repo: String
let name: String
let imageUrl: URL
let action: String
// MARK: - JSON -> Event
init(dictionary: AnyDict) {
guard let repoDict = dictionary["repo"] as? AnyDict,
let actor = dictionary["actor"] as? AnyDict,
let repoName = repoDict["name"] as? String,
let actorName = actor["display_login"] as? String,
let actorUrlString = actor["avatar_url"] as? String,
let actorUrl = URL(string: actorUrlString),
let actionType = dictionary["type"] as? String
else {
fatalError()
}
repo = repoName
name = actorName
imageUrl = actorUrl
action = actionType
}
// MARK: - Event -> JSON
var dictionary: AnyDict {
return [
"repo" : ["name": repo],
"actor": ["display_login": name, "avatar_url": imageUrl.absoluteString],
"type" : action
]
}
}
在我的viewController类中,我有代码从Api加载数据并填充输出事件对象模型。完整的代码看起来像这样:
let response = Observable.from([repo])
.map { urlString -> URL in
return URL(string: "https://api.github.com/repos/\(urlString)/events")!
}
.map { url -> URLRequest in
return URLRequest(url: url)
}
.flatMap { request -> Observable<(HTTPURLResponse, Data)> in
return URLSession.shared.rx.response(request: request)
}
.shareReplay(1)
response
.filter { response, _ in
return 200..<300 ~= response.statusCode
}
.map { _, data -> [[String: Any]] in
guard let jsonObject = try? JSONSerialization.jsonObject(with: data,
options: []),
let result = jsonObject as? [[String: Any]] else {
return [] }
return result
}
.filter { objects in
return objects.count > 0
}
.map { objects in
return objects.map(Event.init)
}
.subscribe(onNext: { [weak self] newEvents in
self?.processEvents(newEvents)
})
.disposed(by: bag)
我的问题是 - 我不明白以下的含义:
.map { objects in
return objects.map(Event.init)
我意识到这段代码不知何故给我们来自[String: Any]
object的事件对象。
但我不理解objects.map(Event.init)。
对我来说,在map中我们应该执行相应类型的操作,例如{Event.init(with:$ 0)}或类似的东西。
objects.map(Event.init
)的含义是什么?
它是如何工作的?
答案 0 :(得分:1)
map(Event.init)
和map({Event.init(with: $0)})
是等效的。
以这种方式思考,map
需要一个带有T
类型的闭包并返回U
类型的东西。 {Event.init(with: $0)}
是一个闭包(接受一个参数$0
,创建一个新的Event
并返回它),所以你可以传入它。
但请不要忘记,方法和初始化程序也是一种关闭。 Event
的初始化程序,它接受一个参数并返回Event
,与map
方法需要的内容兼容!因此,不是使用{}
语法传递闭包,而是可以说&#34;使用Event
的初始化程序!&#34;通过做:map(Event.init)