1

最後の質問で、Swift で計算されたプロパティの添え字のセッターを記述する方法を尋ねました。私の質問は理解できるほど十分ではなかったと思います。与えられた答えは、小さなタスクに対して不正確であるか、複雑でした。長い間考えた後、私はまだ頭の良い人がもっと感動的な答えを提供できるのではないかと思います.

混乱を和らげるために、私の質問は、 Swift の配列の添字に対する簡略化された setter 宣言があるかどうかです。Swift には配列の簡略化されたセッター宣言がありますが、添字はありません。

省略形の getter/setter 宣言は次のとおりです。

var center: Point {
    get {
        let centerX = origin.x + (size.width / 2)
        let centerY = origin.y + (size.height / 2)
        return Point(x: centerX, y: centerY)
    }
    set {
        origin.x = newValue.x - (size.width / 2)
        origin.y = newValue.y - (size.height / 2)
    }
}

基本的に、設定されたアクションが更新されるシナリオaction[i]actionButton[i]。これをすばやく行うには、基本的に 2 つの方法があります。

最初の解決策

func setActionAtIndex(index:Int, forValue newValue:SomeClass){
    action[index] = newValue
    self.updateActionButtonAtIndex(index)
}

上記のソリューションは簡単に理解できますが、1 つのクラスに 2 行のコードを必要とする関数が必要です。「スイフト」ではありません。

2 番目の解決策

var action: [SomeClass] {
    subscript(index:Int){
        set(index:Int,newValue:SomeClass){
           action[index] = newValue
           //extra action to be performed 
           updateActionButtonAtIndex(index)

        }
        get{
           return action[index]
        }
    }
}

言うまでもなく、これは絶対に間違っており、この解決策は存在しません。

なぜ間違っているのですか?

Expected 'get', 'set', 'willSet', or 'didSet' keyword to start an accessor definition

したがって、2番目のソリューションに似ているが機能するソリューションはありますか?

4

2 に答える 2

4

あなたが理解していないのは、普通のセッターあなたが探している速記だということです。オブジェクトに配列プロパティがあり、誰かがその配列に設定すると、セッターが呼び出されます。

例えば:

class Thing {
    var arr : [Int] = [1, 2, 3] {
        didSet {
            println("I saw that")
        }
    }
}

var t = Thing()
t.arr[1] = 100 // "I saw that"

したがってdidSet、新しい値を古い値と比較し、変更に応じて変更するだけです。

于 2015-01-18T01:21:31.787 に答える
1

別の方法を考えましたが、あまり好きではありません。拡張機能を使用して、別の添字をセッターに Array に追加します。これにより、コールバックを提供できるようになります。このアプローチの問題は、コールバックを提供することを忘れないことです! これは、インデックスに設定する人に責任を負わせますが、これはおそらくあなたが考えていたものではありません. それでも、一度構成すると、簡潔になるという利点があります。また、時間がかかりますO(0)

extension Array {
    subscript(ix:Int, f:(T,T,Int)->Void) -> T {
        set {
            let old = self[ix]
            self[ix] = newValue
            f(old,newValue,ix)
        }
        get {
            return self[ix]
        }
    }
}

class Thing {
    var arr : [Int] = [1, 2, 3]
    func f (oldv:Int, newv:Int, ix:Int) {
        println("changed \(oldv) to \(newv) at \(ix)")
    }
}

var t = Thing()
t.arr[1,t.f] = 100 // "changed 2 to 100 at 1"
于 2015-01-18T16:27:09.967 に答える