为了简短起见,我想要实现的目标就是:
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(){
}
}
答案 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
}
}