Параметры метода быстрой передачи Struct Decodable

, Swift 4, как я могу передать Decodable Struct в параметрах метода и проанализировать его в JSONDecoder()? ошибка:

Невозможно вызвать «декодирование» со списком аргументов типа «(Декодируемый, из: данных)»

struct JsonRespons: Codable {
    let uid: String
    let msisdn: String
    let APK: String
    let fname: String
    let lname: String
}

struct JsonResponsError: Decodable {
    let uid: String
    let error: String
}

extension UIView {

func phoneAuth(serverApi path:String, jsonStruct:Codable){
    let jsonUrlString = Globals.JOSN_API_URL + path
    guard let url = URL(string: jsonUrlString) else {
        return

    }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard err == nil else {
            return
        }

        guard let data = data else { return }

        do {
            let result = try JSONDecoder().decode(jsonStruct.self, from: data)
            self.handleJsonResult(resalt: result as AnyObject)

        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }

    }.resume()
}


    func handleJsonResult(resalt:AnyObject){
        print(resalt)
    }

}

person Hattori Hanzō    schedule 07.12.2017    source источник
comment
Не совсем понятно, чего вы пытаетесь достичь здесь. Похоже, вы хотите иметь возможность передавать экземпляр произвольного Decodable типа, а затем декодировать некоторые данные в новый экземпляр на основе динамического типа исходного экземпляра. Но почему именно вы этого хотите? Как вы планируете использовать result после этого?   -  person Hamish    schedule 07.12.2017
comment
@Hamish отредактировал код примера. Я передаю результат в качестве параметра в методе.   -  person Hattori Hanzō    schedule 07.12.2017
comment
Замените let result = try JSONDecoder().decode(jsonStruct.self, from: data) на let result = try JSONDecoder().decode(JsonRespons.self, from: data) Дайте мне знать, что это работает   -  person Prashant Tukadiya    schedule 07.12.2017
comment
@PrashantTukadiya да, это работает, я хочу передать Struct как параметр, например phoneAuth("https://MY_API", JsonRespons.self)   -  person Hattori Hanzō    schedule 07.12.2017
comment
@VakhtangiBeridze Тогда вы должны четко указать это в своем вопросе;) В этом случае вам не нужен параметр Codable, вам нужен общий заполнитель T : Decodable и параметр T.Type.   -  person Hamish    schedule 07.12.2017
comment
Пожалуйста, покажите этот метод phoneAuth и, как @Hamish Said, обновите этот метод с общим параметром, это легко для вас. И, пожалуйста, обновите свои вопросы соответственно. если возможно   -  person Prashant Tukadiya    schedule 07.12.2017
comment
@PrashantTukadiya, как я могу обновить с помощью универсального, можете ли вы показать мне пример, я новичок в Swift ((   -  person Hattori Hanzō    schedule 07.12.2017
comment
@ Хэмиш, как это заархивировать, можешь мне показать? Благодарность   -  person Hattori Hanzō    schedule 07.12.2017


Ответы (2)


Добавление Codable в список наследования для Landmark запускает автоматическое соответствие, которое удовлетворяет всем требованиям протокола. требования из кодируемые и декодируемые:

Вы можете использовать Codable

struct Landmark: Codable {
    var name: String
    var foundingYear: Int

    // Landmark now supports the Codable methods init(from:) and encode(to:), 
    // even though they aren't written as part of its declaration.
}

Альтернативное решение

func phoneAuth(serverApi path: String, Completion block: @escaping ((Data) -> ())) {

    URLSession.shared.dataTask(with: URL(string: url)!) { (data, res, err) in

        if let d = data {
            block(d)
        }
    }.resume()
}

Вызов методов

phoneAuth(serverApi: "yourUrl") { (data) in

    do {
        let result = try JSONDecoder().decode(YourDecodable.self, from: data)
    } catch let jsonErr {
        print("Error serializing json:", jsonErr)
    }
}
person AshvinGudaliya    schedule 07.12.2017
comment
Я получаю сообщение об ошибке компиляции let result = try JSONDecoder().decode(jsonStruct.self, from: data) Невозможно вызвать 'decode' со списком аргументов типа '(Codable, from: Data)' - person Hattori Hanzō; 07.12.2017
comment
Обратитесь к этому stackoverflow.com/a/27162499/6822622, вы передаете протокол как параметр, который невозможен без @Objc , - person AshvinGudaliya; 07.12.2017
comment
ваше решение сработало для меня, это немного сложно, но помогло, спасибо - person Hattori Hanzō; 07.12.2017

Вам не нужно передавать его в качестве параметра, вы можете добиться декодирования, как показано ниже.

extension UIView {

func phoneAuth(serverApi path:String){
    let jsonUrlString = Globals.JOSN_API_URL + path
    guard let url = URL(string: jsonUrlString) else {
        return

}

URLSession.shared.dataTask(with: url) { (data, response, err) in
    guard err == nil else {
        return
    }

    guard let data = data else { return }

    do {
        let result = try JSONDecoder().decode(JsonRespons.self, from: data)
        self.handleJsonResult(resalt: result as AnyObject)

    } catch let jsonErr {
        print("Error serializing json:", jsonErr)
    }

}.resume()
}
person Joshua Cleetus    schedule 08.03.2019