Swift 运算符`下标`[]

Swift operator `subscript` []

我是 Swift 的初学者,对运算符没有任何高级知识。

我有以下class

class Container {
   var list: [Any] = [];
}

我想实现运算符 subscript [] 以访问来自 list 的数据。

我需要这样的东西:

var data: Container = Container()
var value = data[5]
// also    
data[5] = 5

我也希望能够写出这样的东西:

data[1][2]

是否可以考虑 Container 中的元素 1array

感谢您的帮助。

class Container
{
    var list: [AnyObject] = ["hello" , "world"];
    subscript ( i : Int) -> AnyObject{
        get{
            return list[i]
        }
        set{
            list[i] = newValue
        }
    }
}

var c : Container = Container()
println(c[1])

c[1] = "lol"

println(c[1])

有关运算符的更多信息:http://nshipster.com/swift-operators/

这里好像有2个问题。

1。如何在我自己的自定义 class 上启用 subscripting

要在您的 class Container 上启用 subscripting,您需要像这样实现 subscript 计算 属性。

class Container {
    private var list : [Any] = [] // I made this private

    subscript(index:Int) -> Any {
        get {
            return list[index]
        }
        set(newElm) {
            list.insert(newElm, atIndex: index)
        }
    }
}

现在可以这样使用了

var container = Container()
container[0] = "Star Trek"
container[1] = "Star Trek TNG"
container[2] = "Star Trek DS9"
container[3] = "Star Trek VOY"

container[1] // "Star Trek TNG"

2。我可以访问 Container 的一个元素,它支持下标写类似 data[1][2] 的东西吗?

如果我们使用你的例子,不,你不能。因为 data[1] returns 类型 Any。而且你不能下标 Any.

但是如果你加一个cast就可以了

var container = Container()
container[0] = ["Enterprise", "Defiant", "Voyager"]
(container[0] as! [String])[2] // > "Voyager"

听起来你在找下标。您可以为自己的类型创建下标,如下例所示:

class Container {
    var list = [["Hello", "World"], ["Foo", "Bar"]]

    subscript(index: Int) -> [String] {
        get {
            return list[index]
        }
        set {
            list.insert(newValue, atIndex: index)
        }
    }
}

上面的例子使用双 [ ] 只是因为我知道我们要 return 和 Array。这里 Array 包含字符串作为示例,但您当然可以换成您自己的类型

var container = Container()

container[0][0] = "Stack"
container[0][1] = "Overflow"

print(container[0][0]) // "Stack"
print(container[1][1]) // "Bar"

解决方法是在 subscript

中利用多个参数

因此,您可以说 data[1, 2] 而不是 data[1][2]。这在某些情况下会很方便

struct Container {
  subscript(a: Int, b: Int) -> String {
    print(a)
    print(b)
    return "possible"
  }
}

let data = Container()
data[1, 2]

Swift 5.2:在 UserDefaults 值中订阅 - 有用的管理器

Static function with generic type

class Defaults {

   static subscript<T>(key: DefaultsKey) -> T? {
      get {
        return UserDefaults.standard.value(forKey: key.rawValue) as? T
      }
      set {
        UserDefaults.standard.set(newValue, forKey: key.rawValue)
      }
    }
}

enum DefaultsKey: String {
    case firstKey = "JSGHDjasgchvsas"
}

保存值

Defaults[.firstKey] = 34

取值

let value: Int = Defaults[.firstKey]

编码愉快!

class Container {
    private var list = [Any]()
    subscript(_ index: Int) -> Int? {
       get {
            guard index < list.count else { return nil }
            return list[index]
      }
       set(newValue){
          guard let unwrappedElement = newValue else { return }
          list.insert(unwrappedElement, at: index)
       }
    }
}

Here we are using subscripts with optional type to handle index out of range.