0

Swiftのクラスを使用して、スタックで「オプションの場合」を宣言する方法がよくわかりません。クラスを使用する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
    }
}

Stack のインスタンスを作成します。

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

ポップすると、スタックは最後のアイテムを削除します。pop(0) を実行するとスタックが最初のアイテムを削除するようにしたいのですが、pop() だけを実行するとスタックは最後のアイテムのみを削除します。if ... return items.removeAtIndex(0) または else items.removeLast() でオプションの値を作成することを考えていました。構文を正しく理解できないようで、エラーが発生し続けます。pop(0) でスタックの最初のアイテムを削除するようにできましたが、pop() を実行するとエラーが発生します。誰かが私がやりたいことをするためのコードを見せてくれれば、それは本当に役に立ちます。私はまだコーディングが非常に新しく、あまり知りません。恥ずかしくてすみません!

4

2 に答える 2

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()
于 2014-09-02T05:35:49.390 に答える
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
    }
}

Swift が Objective-C と比較して持っている (最も評価の高い機能) 新機能の 1 つはジェネリックです。ここにあります:

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
    }
}

このようにして、それを再利用して任意のタイプのデータを保存でき、文字列だけに限定されません

于 2014-09-02T05:45:07.913 に答える