Xcode выдает мне эту ошибку:
Невозможно преобразовать значение типа «Соответствовать?» к ожидаемому типу элемента «Array.ArrayLiteralElement» (он же «Match»)
в Preview на линии:
Match(dictionary: ["initiator": "a", "performer": "b"]),
Когда я пытаюсь вставить пару этих парней типа класса Match в предварительный просмотр:
import Foundation
class Match: Identifiable {
public let id = UUID()
public var initiator : String?
public var performer : String?
required public init?(dictionary: NSDictionary) {
initiator = dictionary["initiator"] as? String
performer = dictionary["performer"] as? String
}
}
В моем предварительном просмотре у меня есть это:
#Preview {
LatestMatchesView(matches: [
Match(dictionary: ["initiator": "a", "performer": "b"]),
Match(dictionary: ["initiator": "c", "performer": "d"])
])
}
Это код представления для приведенного выше предварительного просмотра:
import SwiftUI
struct LatestMatchesView: View {
@State var matches = [Match]()
var body: some View {
Text("LATEST MATCHES:")
List(matches) { match in
MatchListingView(match: match)
}
.onAppear {
if ApiUtility.sharedInstance.isConnectedToNetwork() {
let param : NSDictionary = [:]
ApiUtility.sharedInstance.httpGet(url: WS_URL(url: LatestMatchesAPI), parameters:param) { (response, error) in
//self?.hideLoading()
if (error == nil) {
self.manageResponse(r: response!)
} else {
}
}
}
}
Spacer()
} // END var body
}
Что мне здесь не хватает? Я пробовал некоторые вещи, но ничего из них не работает.
Код просмотра теперь включен.
@JoakimDanielson, как литерал может быть необязательным? Я пытаюсь ввести литерал в параметры конструктора предварительного просмотра.
Массив может быть литералом, но не элементами массива, они являются результатом вызова метода init.
Удаление ? из init сделал свое дело. Теперь init не является необязательным.





Проблема в том, что инициализатор Match является «неудачным» инициализатором, а это означает, что если экземпляр не может быть инициализирован по какой-либо причине, он вернет nil. Вы можете сказать, что инициализатор не работает, по знаку вопроса после init.
Это означает, что литерал массива, которому вы передаете ListMatchView, равен Array<Match?>, а не Array<Match>. Вы можете быстро это исправить, компактно отобразив массив, в результате чего создается массив только с необязательными значениями. Например:
LatestMatchesView(matches: [
Match(dictionary: ["initiator": "a", "performer": "b"]),
Match(dictionary: ["initiator": "c", "performer": "d"])
].compactMap({ $0 }))
В качестве альтернативы, если архитектура вашего приложения позволяет это, вы можете преобразовать неудачный инициализатор в обычный инициализатор, удалив ? после init. Если вы это сделаете, компактное отображение не потребуется.
Вы не включили код представления, но похоже, что он ожидает значения типа [Match], но вы отправляете массив дополнительных опций [Match?]. Обходной путь: добавьте
.compactMap{ $0 }в конец массива при вызовеLatestMatchesView(matches:). Но я не понимаю, почему init объявлен как необязательный, поэтому, возможно, это можно изменить.