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
中的元素 1
是 array
?
感谢您的帮助。
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.
我是 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
中的元素 1
是 array
?
感谢您的帮助。
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.