通过下标访问元组
Access tuples by subscript
假设我有这个代码:
let tuples = ("1", 2, "3", "4", "5", "6", "7", false)
func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row:Int) -> NSView?
{
let valueForView = tuples[row]
}
有什么方法可以通过下标访问元组吗?
不行,只能通过直接指定索引来访问元组元素,例如
tuples.5
为了您的目的,您应该简单地使用一个数组。
元组无法实现您想要的,如果您不想稍后强制转换所有内容,您唯一的选择是结构或 class。 struct 似乎是更好的选择:)
struct MyStruct {
let opt1 = 0
let opt2 = 0
let opt3 = 0
...
let boolThing = false
}
如果您愿意在元组周围做一个包装器,这实际上是可能的。话虽这么说,这太可怕了,永远不要这样做。其他答案中的建议实际上要好得多,但出于教育目的,这是我的示例。
struct TupleWrapper {
let tuple: (String, Int, String, String, String, String, String, Bool)
let count: Int
private let mirrors: [MirrorType]
subscript (index: Int) -> Any {
return mirrors[index].value
}
init(tuple: (String, Int, String, String, String, String, String, Bool)) {
self.tuple = tuple
var mirrors = [MirrorType]()
let reflected = reflect(tuple)
for i in 0..<reflected.count {
mirrors.append(reflected[i].1)
}
self.mirrors = mirrors
self.count = mirrors.count
}
}
let wrapper = TupleWrapper(tuple: ("1", 2, "3", "4", "5", "6", "7", false))
wrapper[0] // "1"
wrapper[wrapper.count - 1] // false
上面的代码使用 Swift 的反射 API 来获取元组对象的逻辑子对象,并将它们的镜像添加到一个数组中,我们可以在该数组上为每个镜像的值下标。这是相当简单的,但正如您所期望的那样,由于我们在这里使用元组,因此不能以任何方式使其真正动态化。必须为特定的元组类型制作包装器。
有关一些相关阅读,请参阅 NSHipster 最近的 MirrorType 文章。
使用反射是有可能的:
Mirror(reflecting: tuples).children[AnyIndex(row)].value
假设我有这个代码:
let tuples = ("1", 2, "3", "4", "5", "6", "7", false)
func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row:Int) -> NSView?
{
let valueForView = tuples[row]
}
有什么方法可以通过下标访问元组吗?
不行,只能通过直接指定索引来访问元组元素,例如
tuples.5
为了您的目的,您应该简单地使用一个数组。
元组无法实现您想要的,如果您不想稍后强制转换所有内容,您唯一的选择是结构或 class。 struct 似乎是更好的选择:)
struct MyStruct {
let opt1 = 0
let opt2 = 0
let opt3 = 0
...
let boolThing = false
}
如果您愿意在元组周围做一个包装器,这实际上是可能的。话虽这么说,这太可怕了,永远不要这样做。其他答案中的建议实际上要好得多,但出于教育目的,这是我的示例。
struct TupleWrapper {
let tuple: (String, Int, String, String, String, String, String, Bool)
let count: Int
private let mirrors: [MirrorType]
subscript (index: Int) -> Any {
return mirrors[index].value
}
init(tuple: (String, Int, String, String, String, String, String, Bool)) {
self.tuple = tuple
var mirrors = [MirrorType]()
let reflected = reflect(tuple)
for i in 0..<reflected.count {
mirrors.append(reflected[i].1)
}
self.mirrors = mirrors
self.count = mirrors.count
}
}
let wrapper = TupleWrapper(tuple: ("1", 2, "3", "4", "5", "6", "7", false))
wrapper[0] // "1"
wrapper[wrapper.count - 1] // false
上面的代码使用 Swift 的反射 API 来获取元组对象的逻辑子对象,并将它们的镜像添加到一个数组中,我们可以在该数组上为每个镜像的值下标。这是相当简单的,但正如您所期望的那样,由于我们在这里使用元组,因此不能以任何方式使其真正动态化。必须为特定的元组类型制作包装器。
有关一些相关阅读,请参阅 NSHipster 最近的 MirrorType 文章。
使用反射是有可能的:
Mirror(reflecting: tuples).children[AnyIndex(row)].value