2015-04-26 3 views
8

yılında protokole uygun:tip özelliğini yapın ve ayrıca belirli türde ve aynı zamanda böyle Objective-C yapardı protokol, uygun bir özellik yapmak istiyorum Swift

@property (nonatomic) UIViewController<CustomProtocol> *controller; 

Aradığım şey, özellik, özel sınıfın ile uyumlu olan UIViewController türünde bir nesneyle ayarlanabileceğini belirtmektir, böylece temel sınıfın ne olduğu anlaşılır. Ben, muhtemelen sadece aynı sonuçları elde etmek için kısa bir sınıf saplama kullanabilirsiniz yani

class CustomViewController : UIViewController, CustomProtocol {} 

biliyorum Ama bunu yapmak için en temiz yolu gibi görünmüyor.

cevap

7

Bunu Swift'de ifade etmenin iyi bir yolunu düşünemiyorum. syntax for a type:

tip → dizi türü | sözlük tipi | işlev türü | tip tanımlayıcı | tuple-tipi | isteğe bağlı tip | örtülü-unwrapped-isteğe bağlı-tür | protokolü-kompozisyon türü | metatype tipi de bir temel sınıf kabul protokol kombinasyonu tipi bir tür olması için olurdu arıyoruz?

. (Protokol-bileşimi tipi, protocol<Proto1, Proto2, Proto3, …>'dir.) Ancak, bu şu anda mümkün değildir.

İlişkili tür gereksinimlerine sahip protokollerin, gerekli bir temel sınıf ve gerekli protokolleri belirleyen türlere sahip olmasına izin verilir, ancak bunlar ayrıca derleme zamanında türlerin bilinmesini gerektirir, bu nedenle sizin için geçerli bir seçenek olma olasılığı yoktur.

Gerçekten içine giriyorsanız, kullandığınız UIViewController arabiriminin bölümleriyle bir protokol tanımlayabilirsiniz, uyumluluk eklemek için bir uzantı kullanın ve ardından protocol<UIViewControllerProtocol, CustomProtocol> kullanın.

protocol UIViewControllerProtocol { 
    func isViewLoaded() -> Bool 
    var title: String? { get set } 
    // any other interesting property/method 
} 

extension UIViewController: UIViewControllerProtocol {} 

class MyClass { 
    var controller: protocol<UIViewControllerProtocol, CustomProtocol> 
} 
+0

. Yapmamız gereken bu. Sadece ihtiyaç duyacağımız her şeye sahip olan bir protokolü tanımlayın ve protokole uygun olarak bu yöntemlerin tümünü uygulayan UIViewController gibi şeyleri genişletin. – nhgrif

+1

Ben sadece sınıf saplamasını yapmakla devam ettim, daha fazla gelişirken, protokole bağlı kalmaktan ziyade benim için daha mantıklı geldi. Teşekkürler! – sashimiblade

+0

Ancak, "var denetleyicinizi", UIViewController protokollerini değil UIViewControllers'ı bekleyen bir UIKit yöntemine nasıl iletirsiniz? Örneğin, navigiationController? .viewControllers = [controller] ' –

3

Bu yerleşik bileşimi kullanarak mümkündür: Gerçekten de

var children = [UIViewController & NavigationScrollable]()

+0

Bu kabul edilmelidir (Swift 4) – sdgandhi

İlgili konular