2014-09-02 41 views
0

我不能完全弄清楚如何在Swift上使用class聲明「if optional」。 下面是我使用類在Swift上使用堆棧的通用代碼(本書使用struct,但我被告知使用類)。如何聲明「如果可選」在Swift上的堆棧

class Stack { 
    var items = [String]() 
    func push(item: String) { 
     items.append(item) 
    } 
    func pop() -> String { 
     return items.removeLast() 
    } 
    func length() -> Int { 
     return items.count 
    } 
} 

創建堆棧的一個實例:

var stringStack = Stack() 
... 
stringStack.pop() 

當我彈出,堆棧刪除最後一個項目。我想這樣做,如果我彈出(0),堆棧將刪除第一個項目,但如果我只是做pop(),堆棧只會刪除最後一個項目。我正在考慮如果...返回items.removeAtIndex(0)或其他items.removeLast()。我似乎無法得到正確的語法,我不斷收到錯誤。我能夠使pop(0)移除堆棧中的第一個項目,但是如果我使用pop(),則會出錯。如果有人可以給我看一個代碼來做我想做的事情,那真的很有幫助。我在編碼方面仍然非常非常新,而且我不太瞭解。對不起,尷尬!

回答

1

您正在查找可選參數,其中的默認值爲。通過這種方式,您可以撥打pop()以刪除堆棧中的最後一個項目或pop(index)以刪除特定項目。

調用pop用參數表示可選index具有值,因此使用第一返回。在沒有參數的情況下調用index將使其缺省值,因此if語句失敗,而是刪除最後一個項目。

func pop(_ index: Int? = nil) -> String { 
    if let i = index { 
     return items.removeAtIndex(i) 
    } 

    return items.removeLast() 
} 
// ... 
stack.pop(0) 
stack.pop() 
0

您必須重載pop函數,即創建具有不同簽名的2個版本。另外我建議返回一個可選項,因爲如果該數組爲空,或者如果讓它彈出一個不存在的項,它將生成一個運行時異常。這是修改後的版本:

class Stack { 
    var items = [String]() 

    func push(item: String) { 
     items.append(item) 
    } 

    func pop() -> String? { 
     return length() > 0 ? items.removeLast() : nil 
    } 

    func pop(index: Int) -> String? { 
     return index < length() ? items.removeAtIndex(index) : nil 
    } 

    func length() -> Int { 
     return items.count 
    } 
} 

之一(最欣賞的功能)的新功能雨燕相比,Objective-C的是仿製藥,爲什麼不能在一個容器類像堆棧使用它嗎?那就是:

class Stack<T> { 
    var items = [T]() 

    func push(item: T) { 
     items.append(item) 
    } 

    func pop() -> T? { 
     return length() > 0 ? items.removeLast() : nil 
    } 

    func pop(index: Int) -> T? { 
     return index < length() ? items.removeAtIndex(index) : nil 
    } 

    func length() -> Int { 
     return items.count 
    } 
} 

這樣,您就可以重複使用它來存儲任何類型的數據,而不是限制它只是字符串