2016-03-28 30 views
0

Neden işlev bildirim satırında Inheritance from non-protocol, non-class type aşağıdakilerle başarısız olur?İşlev türüne ilişkili genel parametre

protocol Foo { 
    associatedtype AType 
} 

struct Container<F: Foo> { 

    let foo: F 

    func doWork<S: F.AType>(s: S) { } 
} 

cevap

1

Not olduğunu aşağıdaki derler: Ancak

protocol Foo { 
    associatedtype A 
} 

struct Container<F: Foo> { 

    func f(a: F.A) { } 
} 

, söz konusu:

struct Container<F: Foo> { 

    func f<A : F.A>(a: A) { } // error: inheritance from non-protocol, non-class type 
} 

... iyi olabilir, böylece tip F.A tamamen kısıtsız olduğunusözdizimini kullanamayacağınız veya bunlarla uyumlu olamayacağınız bir Int. Eğer gerçekten (a: F.A) daha genel bir çözüm gerekiyorsa

sonra bu satırlar boyunca bir şey bunu yapabilir:

protocol Bar { } 

protocol Foo { 
    associatedtype A : Bar 
} 

struct Container<F: Foo> { 

    func f<A : Bar>(a: A) { } 
} 

Artık Bar protokolü kullanılarak a parametresi hakkında herhangi bir beklentileri ifade edebilir.

Daha da iyisi, sen Foo bir uzantısı olarak yöntemini uygulamak mümkün olabilir: Benim kullanım durumunda

protocol Foo { 
    associatedtype A 

    func f(_: A) // if you want this to be a requirement 
} 

extension Foo /* where A is constrained so you can do something with it */ { 

    func f(a: A) { } 
} 
+0

, 'Container' yöntemi' f' Foo 'bir alt sınıf olarak kısıtlı olmalıdır 'tür. Yani, ya Foo.A ya da bir alt sınıfa yazılmalıdır. F.A'nın sınırsız olduğunu söylediğinizde sorun olduğundan emin değilim. Sonuçta, "A" Bar "," türkçe (a: A) {} "işlevlerini yerine getirmemiz hâlâ başarısız olur. – Stephen

+0

Snippet'lerimiz arasındaki farkı fark ettim. Hatanın nedeni olarak F.A'nın tamamen sınırsız olduğunu söylediğiniz yere yanıt veriyorum. Kısıtlamalarla bile, sonuç aynıdır. İlişkilendirilmiş bir tür neden bir kısıtlama olarak kullanılmaz? – Stephen

İlgili konular