205


Objective-Cでは以下のように、複数のプロトコルを実装した具体的な型で変数宣言やプロパティ定義など出来ますが、

[code]

    UIView<FooProtocol, BarProtocol>* myView = ...
    
[/code]

Swiftでは同様の書き方ありませんか？


CC BY-SA 3.0
2014-11-25T07:08:55.180
184
2015-12-30T03:24:02.227
55
question
swift objective-c
SwiftでUIView<FooProtocol, BarProtocol>相当の宣言て出来ますか？


直接Objective-
Cと同じことはできませんが、型拡張で同じ事はできると思います。型Tがprotocolに適合していればそれはグローバルな状態だとおもうので、これでいいんじゃないでしょうか。

[code]

    protocol FooProtocol {
        var foo: String { get }
    }
    protocol BarProtocol {
        var bar: String { get }
    }
    
    extension UIView: FooProtocol, BarProtocol {
        var foo: String { return "foo" }
        var bar: String { return "bar" }
    }
    
    let a = UIView()
    a.foo // "foo"
    a.bar // "bar"
    
[/code]


CC BY-SA 3.0
2014-12-02T00:18:45.480
205
2014-12-02T00:18:45.480
114
184
answer


似てますが、以下の方法もありますね。

[code]

    protocol FooProtocol {
        var foo: String { get }
    }
    protocol BarProtocol {
        var bar: String { get }
    }
    
    class CompositeProtocolUIView: UIView, FooProtocol, BarProtocol {
        var foo: String { return "foo" }
        var bar: String { return "bar" }
    }
    
    let a = CompositeDelegateUIView()
    a.foo // "foo"
    a.bar // "bar"
    
[/code]


CC BY-SA 3.0
2014-12-02T02:11:26.253
219
2014-12-02T02:22:00.673
2014-12-02T02:22:00.673
55
55
184
answer


Genericsを使うことで具体的かつ必要最低限の制約で書くことができます。

[code]

    class MyClass <T:UIView where T:FooProtocol, T:BarProtocol> {
        var fbView:T?
    }
    
[/code]

ちなみに

[code]

    class FooBarButton : UIButton, FooProtocol, BarProtocol {}
    
[/code]

型を決め打ちするやり方だと今回は UIButton,Foo,Bar → UIView,Foo,Bar
のキャストをさせてもらえず渡すことができない一方、Genericsなら上のようなクラスもプロパティに代入できます。


CC BY-SA 3.0
2014-12-19T18:25:55.877
2171
2014-12-19T18:25:55.877
5290
184
answer