了解Swift地图语法

时间:2017-11-12 13:17:27

标签: ios swift

我学习代码,并拥有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)的含义是什么? 它是如何工作的?

1 个答案:

答案 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)