SwiftUI Как исправить «Невозможно определить тип возвращаемого значения сложного замыкания; добавить явный тип для устранения неоднозначности» - PullRequest
0 голосов
/ 28 марта 2020

Я не знаю, как исправить эту ошибку "Невозможно определить тип возвращаемого значения сложного замыкания; добавить явный тип для устранения неоднозначности". Я уже все продумал (что могу) и не работает

import SwiftUI  

struct ContentView: View {  

    @State var content: String = "start"  


    var body: some View {  

        VStack { // Unable to infer complex closure return type; add explicit type to disambiguate  

            self.content = try! String(contentsOf: URL(string: "http://zyglarski.pl/swift-http-docs/tinder_list.php")!)  

            var contentData = self.content.data(using: .utf8)  
            var jsDec = JSONDecoder()  
            var responce = try! jsDec.decode(Candidates.self, from: contentData!)  

            Text(responce)  
        }  
    }  
}  

struct ContentView_Previews: PreviewProvider {  
    static var previews: some View {  
        ContentView()  
    }  
}  


struct Candidates: Codable {  
    let candidates:[Candidate]  
}  
struct Candidate: Codable {  
    let filename: String  
    let name: String  
    let age: String  
    let distance: String  
    let match: String  
} 

Помогите, пожалуйста

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

В качестве дополнения к ответу Криса:

Давайте немного посмотрим на замыкания. «Нормальное» замыкание, которое мы можем видеть, например, с .map { ... } с массивами, которое применяет функцию к каждому элементу списка и возвращает новый список с результатами, например:

let myArray = [1, 2, 3, 4, 5]
tenTimes = myArray.map { (element) -> (Int) in
    return element * 10
}
// tenTimes is [10, 20, 30, 40, 50]

(element) -> (Int) in означает: мы получаем параметр и называем его element, чтобы мы могли использовать его внутри замыкания, а тип возвращаемого значения замыкания - Int.

Часто мы используем сокращенную версию для второй строки этого небольшого фрагмента кода:

myArray.forEach { element in

В этом случае Swift может определить тип возвращаемого значения.

Но поскольку (я полагаю) Swift 5.1, есть новое правило: , когда содержимое функции / переменной / замыкания составляет только одну строку кода, нам не нужно явно писать слово return. Так что в приведенном выше случае мы могли бы также сказать:

tenTimes = myArray.map { element in
    element * 10
}

SwiftUI часто использует это. Но есть еще кое-что: замыкания в SwiftUI - это специальные замыкания @ViewBuilder. следовательно, вы можете поместить несколько представлений в другое представление, как если бы у вас была функция с несколькими return s. Но когда вы используете другой код, такой как оператор let, все портится. SwiftUI не понимает, что вы хотите.
Иногда вы можете немного помочь, используя явный return, но часто ошибка просто перемещается в другое место. Есть шанс, что после многих недоразумений, вы получите его, но я могу заверить вас, что это не будет красивый код. Поэтому я бы выбрал решение Криса.


Если вы хотите узнать больше о замыканиях, вот ссылка на официальную документацию: https://docs.swift.org/swift-book/LanguageGuide/Closures.html. Очень интересно, но много информации!
0 голосов
/ 28 марта 2020

пожалуйста, прочитайте учебник для начинающих по swiftui, потому что вы сделали много ошибок для начинающих.

и для быстрой помощи проверьте это:

struct ContentView: View {


    @State var content: String = "start"
    @State var responce : String = ""
    @State var candidates : Candidates = Candidates(candidates: [])

    var body: some View {

        VStack { // Unable to infer complex closure return type; add explicit type to disambiguate



            Text(responce)
                .onAppear() {
                    self.content = try! String(contentsOf: URL(string: "http://zyglarski.pl/swift-http-docs/tinder_list.php")!)

                    var contentData = self.content.data(using: .utf8)
                    var jsDec = JSONDecoder()
                    self.candidates = try! jsDec.decode(Candidates.self, from: contentData!)
            }

        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct Candidates: Codable {
    let candidates:[Candidate]
}
struct Candidate: Codable{
    let filename: String
    let name: String
    let age: String
    let distance: String
    let match: String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...