Jeśli kod taki jak ten, wystawiono błędy i konkurencyjne nie można wywnioskować T = [U].

protocol Foo { }

protocol Bar {
    associatedtype T: Foo
    var type: T { get }
}

struct Baz<U: Foo> {
    let type: [U]
}

extension Baz: Bar { }

/* error message
error: Demo.playground:14:1: error: type 'Baz<U>' does not conform to protocol 'Bar'
extension Baz: Bar { }
^

Demo.playground:6:20: note: unable to infer associated type 'T' for protocol 'Bar'
    associatedtype T: Foo
                   ^

Demo.playground:11:9: note: candidate would match and infer 'T' = '[U]' if '[U]' conformed to 'Foo'
    let type: [U]
        ^
*/

Ale wymień Foo za pomocą Decodable, kompilator może wywnioskować T = [U], dlaczego?

// protocol Foo { }

protocol Bar {
    associatedtype T: Decodable
    var type: T { get }
}

struct Baz<U: Decodable> {
    let type: [U]
}

extension Baz: Bar { }
-1
shinolr 23 listopad 2020, 09:53

1 odpowiedź

Najlepsza odpowiedź

Array ma to rozszerzenie:

extension Array: Encodable where Element: Encodable …

Zrobić to samo.

extension Array: Foo where Element: Foo { }
1
Jessy 23 listopad 2020, 07:02