2016-09-29 20 views
0

subscriptから現在のタイプを返す方法があります。サブクラスごとにサブスクリプトが上書きされることはありません。これが私が探しているものです。サブタイプは各サブクラスでオーバーライドする必要があります。

添え字の戻り値としては使用できませんが、多少の解決策がありますので、Selfは使用できません。

例:

class A { 
    var array = [Int]() 

    init(array: [Int]) { 
     self.array = array 
    } 

    subscript(condition: (Int) -> Bool) -> A { 
     get { 
      return A(array: array.filter(condition)) 
     } 
    } 
} 

class B: A { 
    func aImB() -> Bool { 
     return true 
    } 
} 

let array = [1, 2, 3, 4, 5] 
let objB_1 = B(array: array) 
let objB_2 = objB_1[{ $0 > 3}] 
print(objB_2.dynamicType) // -> will print "A" but I would like to see "B" 
objB_2.aImB() // can't be called because objB_2 is of the type A 

答えて

1

最も簡単な方法は、プロトコル拡張を使用することです:あなたは `VAR列を追加する必要があります

protocol MyProtocol { 
    var array:[Int] {get set} 
    init(array: [Int]) 
} 

extension MyProtocol { 
    subscript(condition: (Int) -> Bool) -> Self { 
     get { 
      return Self(array: array.filter(condition)) 
     } 
    } 
} 

class A:MyProtocol { 
    var array = [Int]() 

    required init(array: [Int]) { 
     self.array = array 
    } 


} 

class B: A { 
    func aImB() -> Bool { 
     return true 
    } 
} 
+1

を:[int]は{取得}'プロトコルにコンパイルするための要件 –

+0

私はこれを使わずに遊び場(Swift 3)で働いています。このプロパティがあることを知るためにプロトコルが必要なのはなぜですか? – sketchyTech

+0

あなたはプロトコル拡張で 'array'プロパティを使っているからです。 (FWIW、私のSwift 3プレイグラウンドもこれについて不平を言う) –

関連する問題