2014-10-12 35 views
9

Bir işlevi bir işlev olarak bir parametre olarak geçirmem gerekiyor. Arabirim, genel bir a.k.a.'nın ilişkili bir türe sahiptir. Bunu yapmanın iyi bir yolunu bulamadım.Swift'de parametreyle ilişkili tür (genel protokol) protokol nasıl iletilir?

protocol IObserver : class { 
    typealias DelegateT 
    ... 
} 

class Observer: IObserver { 
    typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol 
    ... 
} 

func notify(observer: IObserver) { ... } // here I need a type for observer param 

Bu çalışır bulundu: İşte benim kodudur

func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... } 

, ama bu çok karmaşık gel. Bu paramı sınıf değişkenine kaydetmek istersem, bu fonksiyonu nedeniyle tüm sınıfı genel yapmam gerekir.

C++ geliştiriciyim ve Swift diline yeni geldiğim doğru, ama işlerin yapıldığı yol çok karmaşık ve kullanıcı dostu değil ... veya çok aptalım :)

+0

yaptığı gibi Muhtemelen açık ilişkili türünü yapma

  • yapmaya planladığımız ne ben öyle her zaman düşünüyorum. Rahatsızlık gerçekten. C++ açısından, Swift'in “protokolü” nin “kavram” gibi olduğunu düşünüyorum. Ve '' protokol'üne uygun bir tür 'uzantısı' 'concept_map' ile benzerdir. Bu tesisler, derleme zamanı polimorfizmini gerçekleştirmek için yararlıdır. Ancak, çoğu durumda, 'salt sanal sınıf' + 'çoklu kalıtım' gibi bir mekanizma kullanmak isteriz, çalışma zamanı polimorfizmini gerçekleştirmek için Java'nın arabirimine karşılık gelir. Ancak Swift, jenerik tipler için bunlara karşılık gelen hiçbir mekanizmaya sahip olamaz .. – findall

  • +0

    İlgili cevabımı buraya bakın ---> http://stackoverflow.com/a/34995198/5389500 – eonist

    cevap

    5

    Genel iletişim kuralı yapmak için bir protokolde typealias kullanırsanız, ilgili tür çözülene kadar bunu bir değişken türü olarak kullanamazsınız. Muhtemelen yaşadığı gibi, ilişkili türüne sahip bir protokolü kullanarak bir derleme hatası bir değişken (veya işlev parametresi) sonuçlarını tanımlamak için: Bir beton türü olarak kullanmak anlamına gelir

    Protocol 'MyProtocol' can only be used as a generic constraint because it has Self os associated type requirements

    .

    Yani sadece 2 yolu bir beton türü olarak ilişkili türden ile protokol kullanmak farkındayım şunlardır:

    • dolaylı bunu uygulayan bir sınıf oluşturarak. Eğer fonksiyon

    Ayrıca bkz ilgili cevap https://stackoverflow.com/a/26271483/148357

    İlgili konular