2017-04-20 53 views
1

我想要一種符合我自定義協議的UIView類型。我嘗試做這樣的,但Xcode中說,這是不正確的聲明:帶協議問題的swift typealias

typealias ViewThatConformsToProtocol = UIView: MyCustomProtocol 

這並不工作過:

typealias ViewThatConformsToProtocol = UIView, MyCustomProtocol 

但我不希望使用的子類那。有沒有辦法做到這一點?

P.S. 採用子類我會這樣說:

class ViewThatConformsToProtocol: UIView, MyCustomProtocol { 

} 

但我不希望使用子類,因爲這是對我的設計模式(例如,因爲當我只需要知道我查看支持的這個行爲調查協議,我不希望這個視圖繼承ViewThatConformsToProtocol,有時View1可以確認Protocol1和Protocol2,但View2可以遵循Protocol1和Protocol3 - 例如)。在Objective-C中,您可以輕鬆聲明UIView *viewForProtocol = (UIView<MyCustomProtocol> *)view1,但在SWIFT中似乎不可能,所以我正在尋找散步

+0

我真的不明白你想達到什麼目的。你能告訴我們,如果你「爲此使用了子類」,你會怎麼做? – Sweeper

+0

@Sweeper,我添加了代碼和評論。 –

+0

@MaxPevsner,這篇文章沒有幫助 –

回答

0

實際上@ MaxPevsner的建議是正確的,但不是確切的。 你不需要使用typealias,因爲所有的魔法都可以做泛型。

protocol MyCustomProtocol { 
    // ... 
} 

class MyCustomView: UIView, MyCustomProtocol { 

} 

class MyClass<T> where T: MyCustomProtocol { 

    func someFunction<T>(_ value: T) { 
     self.property = value 
    } 
} 

// ... 
let view = MyCustomView() 
let trick = MyClass<MyCustomView>() 
trick.someFunction(view) 

它符合您的要求嗎?

+0

實際上沒有,因爲在這裏我們不需要AnotherCustomProtocol非常多,因爲我需要像在Objective-C中那樣做UIView * viewForProtocol =(UIView *)view1在很多方法中(我將Objective-C代碼轉換成SWIFT) –

+0

@PaulT。更新的代碼片段 – Astoria

0

typealias是特定類型的別名。你問的東西,符合一系列條件

鑑於片斷您發佈

UIView *viewForProtocol = (UIView<MyCustomProtocol> *)view1 

代碼等效SWIFT代碼將

let viewForProtocol = view1 as? MyCustomProtocol as ? UIView 
+0

不,它不會工作,你將只有UIView –

+0

猜你要麼有一個UIView或MyCustomProtocol句柄。你不能擁有兩個 – Spads

0
typealias DesiredAlias<T> = T where T:MyCustomProtocol 

//you can assign type like below 
var variableThatConformsToProtocol: DesiredAlias<MyCustomProtocol> 

也許這一塊代碼符合您的要求?其實它需要符合MyCustomProtocol的任何類型,所以它類似於id<MyCustomProtocol> variableThatConformsToProtocolObjective-C