2016-09-29 42 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

最簡單的方法是使用一個協議擴展:

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

你需要添加'VAR數組:[INT] {}得到'到協議要編譯的要求。 –

+0

我沒有這個在Playground(Swift 3)中工作。爲什麼你需要協議來知道這個屬性? – sketchyTech

+0

因爲您在協議擴展中使用'array'屬性。 (FWIW,我的Swift 3遊樂場也對此抱怨) –

相關問題