Swift运算符`下标`[]

时间:2015-08-11 19:16:15

标签: swift operator-overloading subscript-operator

我是初学者,Swift对操作员没有预先了解。

我有以下课程

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

我想实现运算符subscript [],以便从list访问数据。

我需要这样的东西:

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

此外,我希望能够写出这样的内容:

data[1][2]

是否可以考虑来自1的{​​{1}}元素是Container

Thanx寻求帮助。

6 个答案:

答案 0 :(得分:32)

这里看起来有两个问题。

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

要在班级subscripting上启用Container,您需要像这样实现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]会返回Any类型的内容。你不能下标Any

但是如果你添加一个演员阵容就可以了

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

答案 1 :(得分:5)

解决方法是利用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]

答案 2 :(得分:1)

foreign key cat_id references categories(id) ON DELETE CASCADE;

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

答案 3 :(得分:1)

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

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

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

以上示例仅使用双[ ],因为我知道我们将返回Array。这里Array包含字符串作为示例,但您当然可以交换自己的类型

var container = Container()

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

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

答案 4 :(得分:1)

Swift 5.2:使用UserDefaults值下标-有用的管理器

具有通用类型的静态函数

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]

祝您编程愉快!

答案 5 :(得分:0)

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

在这里,我们使用带有可选类型的下标来处理超出范围的索引。