2014-12-19 44 views
0

如何在swift中擴展數組?如何在swift中將pop()擴展添加到Array?

我想說

extension Array 
{ 
    func pop() -> AnyObject 
    { 
     let out = self.last 
     self.removeLast() 
     return out 
    } 
} 

但是編譯器不喜歡self.removeLast()或返回了

+0

我只是複製了到操場,正如你所說的編譯器卻高興不起來。 ..但是當我重新輸入這條線時很好。我看到的唯一問題是,如果列表有多個類型,你可以安全地轉換返回值嗎? – chris 2014-12-19 02:27:45

+4

removeLast()已經返回它刪除的值。你不必將它保存在一個臨時變量或任何東西中。你的pop()在功能上等同於removeLast()。 – i40west 2014-12-19 02:36:09

+0

謝謝i40west !!! – 2014-12-19 02:50:43

回答

0

我不認爲你應該使用AnyObject。你有沒有學過泛型? 嘗試:

 

    extension Array 
    { 
     func pop() -> T 
     { 
      let out = self.last 
      self.removeLast() 
      return out 
     } 
    } 

1

正如@ i40West指出,removeLast本質上彈出。這就是說,如果你想與原代碼修正編譯器會發出:

  1. 數組可能不包含類引用,以便AnyObject是行不通的。你可以用Any(它可以包含類,結構或枚舉)替換它,但最好返回一個Element,這是Array實例爲其實際包含的任何內容輸入的值。

  2. self.last返回一個可選的(如果數組爲空)。您可以選擇從類似於lastpop返回一個可選項,或者只是在與removeLast類似的陣列爲空時斷言。

  3. 由於pop正在修改self(它刪除的條目)和Array是一個結構,你需要標記功能mutating

,所以該完整版,假設removeLast沒有返回值,可能是這樣的:

extension Array { 
    mutating func pop() -> Element { 
     precondition(self.startIndex != self.endIndex, "Attempt to pop from an empty array") 
     let out = self.last 
     self.removeLast() 
     return out! 
    } 
}