在Swift中为数组的下标计算setter

时间:2014-12-28 09:45:37

标签: xcode swift

为了简短起见,我想要实现的目标就是:

var actions: [String]{
    get{
        if (_actions==nil){
            _actions = []
        }
        return _actions!
    }
    set{
        _actions = newValue
    }
    subscript(index:Int) -> String{
      set {
         assert(index<_actions.count && index>=0, "Index out of range")
         _actions[index] = newValue
      }
    }
}

我知道下标不是数组的访问者,但那么最方便的选择是什么呢?

如果可能的话,我真的很感谢简洁的答案!非常感谢你!

编辑:

扩展我对@jrturton的解释,

我想要实现的是当actions [i]设置为newValue时,我想做一些额外的计算,例如重新定位动作[i]的相应子视图。

但是,如果我说actions[3] = "randomMethod",将调用整个数组的计算setter。对?因此,我想找到一种方法,以便在actions[3]设置为newValue时,可以调用函数repositionView(3),例如。

我知道其他方法可以做到这一点,但我的问题只是想知道是否有一种更方便的方式,比如上面的例子:计算机制定者,做我想做的事情?

编辑2:

为了展示@Vatsal Manot我真正的意思,我删除了下标的getter,这里是一个完整的example.swift(由于错误而无法运行):

import UIKit
import Foundation

class DWActionsSubmenu: UIView{
    var actions: [DWAction]{
        get{
            if (_actions==nil){
                _actions = []
            }
            return _actions!
        }
        set{
            _actions = newValue
        }
        subscript(index:Int) -> DWAction{
            set {
                assert(index<_actions.count && index>=0, "Index out of range")
                _actions[index] = newValue
                a()
            }
        }
    }

    var _actions: [DWAction]?

    init(actions:[DWAction]?){
        super.init()
        _actions = actions
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
    }

    func a(){

    }
}

2 个答案:

答案 0 :(得分:6)

我将您的操作列表包装在自定义类中,然后您可以通过下标访问该类。然后,只要设置了下标成员,就可以添加要运行的块:

class ActionList {
    private var actions = [String]()

    var actionDidChange : ((Int) -> ())?

    subscript(actionIndex:Int) -> String {
        get {
            return actions[actionIndex]
        }
        set {
            actions[actionIndex] = newValue
            if let actionDidChange = actionDidChange {
                actionDidChange(actionIndex)
            }
        }
    }

    func addAction(action: String) {
        actions.append(action)
    }

    func addActions(newActions:[String]) {
        actions += newActions
    }
}

用法(在操场上):

let actionList = ActionList()
actionList.actionDidChange = {
    actionIndex in
    println("Action \(actionIndex) did change")
}

actionList.addActions(["One", "Two", "Three"])
actionList[2] = "New"
// Prints "Action 2 did change"

答案 1 :(得分:0)

以下内容应该有效:

var actions: [String] = []

subscript(index:Int) -> String
{
    get
    {
        assert(index < actions.count && index >= 0, "Index out of range")
        return actions[index]
    }

    set(newValue)
    {
        assert(index < actions.count && index >= 0, "Index out of range")
        actions[index] = newValue
    }
}