Невозможно определить тип замыкания в текущем контексте (SwiftSignalRClient) - PullRequest
0 голосов
/ 01 марта 2020

Я создал новый проект и пытаюсь реализовать фреймворк SwiftSignalR. В моем последнем проекте не было проблем со следующим кодом. Однако в новом проекте я получаю ошибку типа замыкания и могу действительно помочь с некоторой помощью!

Фактическая ошибка гласит: Невозможно определить тип замыкания в текущем контексте

Я действительно не могу понять, почему эта ошибка появляется сейчас, а не в моем предыдущем проекте, за исключением того факта, что я переключился с Swift 4.2 на Swift 5.0 и iOS цель развертывания с 12.0 до 13.0

Мой код выглядит следующим образом:

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { locationUpdate, _ in
        self.locationUpdateReceived(locationUpdate as! [Dictionary<String, Any>])
    }

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, Any>]) {
    print("Location update recieved")
}

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Похоже, что проблема вызвана изменениями в SignalR-Client-Swift API, ранее ожидалось два параметра типов [Any?] И TypeConverter, теперь он имеет ArgumentExtractor и несколько общих перегрузок c. В целом ваш новый код будет выглядеть примерно так:

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { extractor in
    let locationUpdate = try extractor.getArgument(type: [Dictionary<String, Any>].self)
    self.locationUpdateReceived(locationUpdate)
}

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, Any>]) {
    print("Location update recieved")
}

Однако он еще не скомпилируется, потому что для нового API требуется тип Decodable, поэтому вы не можете использовать Any здесь и изменить его на другой тип, поэтому код должен выглядеть так:

struct LocationInfo: Codable {
    var value: String
}

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { extractor in
    let locationUpdate = try extractor.getArgument(type: [Dictionary<String, LocationInfo>].self)
    self.locationUpdateReceived(locationUpdate)
}

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, LocationInfo>]) {
    print("Location update recieved")
}
0 голосов
/ 10 марта 2020

Для Swift Codable я использую это.

private var connection: HubConnection

connection.on(method: "LocationBroadcast", callback: { (jsonResponse: JSON) in
            print(jsonResponse)

            do {
                let locationBroadcast:LocationBroadcast = try JSONDecoder().decode(LocationBroadcast.self, from: jsonResponse.rawData())
            }catch(let error) {
                print(error.localizedDescription)
            }
        })

struct LocationBroadcast: Codable {
    var value: String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...