4

2 番目のプロトコル (ProtocolB) に準拠する単一のプロパティを含むプロトコル (ProtocolA) があります。

public protocol ProtocolA {        
    var prop: ProtocolB? { get }
}

public protocol ProtocolB {        
}

それらを実装する2つのクラスを宣言しようとしています:

private class ClassA : ProtocolA {    
    var prop: ClassB?
}

private class ClassB : ProtocolB {
}

しかし、私はエラーが発生します:

タイプ「ClassA」はプロトコル「ProtocolA」に準拠していません

プロトコルには、タイプ「ProtocolB?」のプロパティ「prop」が必要です

候補に一致しないタイプ 'ClassB?' があります。

ClassBがProtocolBに準拠しているため、これは面倒です。

古き良き私はおそらくプロパティを次のように宣言します:

@property (nonatomic) ClassB <ProtocolB> *prop;

しかし、これを迅速に回避できると思われる唯一の方法は、次のような ivar を追加することです。

private class ClassA : ProtocolA {        
    var _prop: ClassB?
    var prop: ProtocolB? { return _prop }
}

これを回避する方法はありませんか?

4

1 に答える 1

3

typealias他のプロトコルに準拠する型のを宣言する必要があります。あなたがそれをした方法は、それがprop正確に typeProtocolBでなければならないということですが、実際にはそれを望んでおらず、代わりにそれに準拠する型が必要です。

protocol ProtocolA {
    typealias Prop : ProtocolB
    var prop: Prop? { get }
}

protocol ProtocolB {}


class ClassA : ProtocolA {
    var prop: ClassB?
}

class ClassB : ProtocolB {}
于 2015-10-26T22:20:18.000 に答える