Подтвердить что ты не робот

Расширение типа Array с ограничениями не может иметь условие наследования - swift 2

В swift 2 я хочу расширить тип массива. У меня есть протокол JSONDecodable. То, что я хочу сказать компилятору, соответствует Array протоколу JSONDecodable, если элементы Array также JSONDecodable. Вот код:

public protocol JSONDecodable {
    static func createFromJSON(json: [String: AnyObject]) throws -> Self
}

extension Array: JSONDecodable where Element: JSONDecodable {

}

Но компилятор дает ошибку: "Расширение типа Array с ограничениями не может иметь условие наследования"

Итак, есть ли другой способ совершить такое поведение?

4b9b3361

Ответ 1

как насчет небольшого стирания стилей? Он должен сделать галочку

protocol JSONDecodable {
    init(json: JSON) throws
}

Хотя Swift 3 не позволяет делать расширение

extension Array: JSONDecodable where Element: JSONDecodable

но его можно сделать:

extension Array: JSONDecodable {
    init(json: JSON) throws {
        guard let jsonArray = json.array,
            let decodable = Element.self as? JSONDecodable.Type else {
                throw JSONDecodableError.undecodable
        } 

        self = jsonArray.flatMap { json in
            let result: Element? = (try? decodable.init(json: json)) as? Element
            return result
        }
    }
}

Ответ 2

Я думаю, подсказка, которую вы нашли в Twitter, означает что-то вроде этого:

protocol X {
    var xxx: String { get }
}

// This is a wrapper struct
struct XArray: X {

    let array: Array<X>

    var xxx: String {
        return "[\(array.map({ $0.xxx }).joinWithSeparator(", "))]"
    }

}

// Just for this demo
extension String: X {
    var xxx: String {
        return "x\(self)"
    }
}

let xs = XArray(array: ["a", "b", "c"])
print(xs.array) // ["a", "b", "c"]
print(xs.xxx) // [xa, xb, xc]