我是初学者,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寻求帮助。
答案 0 :(得分:32)
这里看起来有两个问题。
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"
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)
具有通用类型的静态函数
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)
}
}
}
在这里,我们使用带有可选类型的下标来处理超出范围的索引。