我可以扩展 Swift 中的元组吗?
Can I extend Tuples in Swift?
我想为 Swift 中的(例如)两个值的元组编写一个扩展。例如,我想写这个 swap
方法:
let t = (1, "one")
let s = t.swap
使得 s
的类型为 (String, Int)
,值为 ("one", 1)
。 (我知道我可以很容易地实现一个 swap(t)
函数,但这不是我感兴趣的。)
我可以这样做吗?我似乎无法在 extension
声明中写出正确的类型名称。
此外,我想答案是一样的,我可以让一个二元组采用给定的协议吗?
您不能在 Swift 中扩展元组类型。
根据
Types,有 命名类型 (其中
可以扩展)和 复合类型 。元组和函数是复合的
类型。
另请参阅(强调):
Extensions
Extensions add new functionality to an existing
class, structure, or enumeration type.
正如上面的回答所述,您不能在 Swift 中扩展元组。但是,除了给你一个不,你可以做的是将元组框在 [=11=]、struct
或 enum
中并扩展它。
struct TupleStruct {
var value: (Int, Int)
}
extension TupleStruct : Hashable {
var hashValue: Int {
return hash()
}
func hash() -> Int {
var hash = 23
hash = hash &* 31 &+ value.0
return hash &* 31 &+ value.1
}
}
func ==(lhs: TupleStruct, rhs: TupleStruct) -> Bool {
return lhs.value == rhs.value
}
作为旁注,在 Swift 2.2 中,最多包含 6 个成员的元组现在是 Equatable
。
详情
- Xcode 11.2.1 (11B500), Swift 5.1
解决方案
struct Tuple<T> {
let original: T
private let array: [Mirror.Child]
init(_ value: T) {
self.original = value
array = Array(Mirror(reflecting: original).children)
}
func getAllValues() -> [Any] { array.compactMap { [=10=].value } }
func swap() -> (Any?, Any?)? {
if array.count == 2 { return (array[1].value, array[0].value) }
return nil
}
}
用法
let x = (1, "one")
let tuple = Tuple(x)
print(x) // (1, "one")
print(tuple.swap()) // Optional((Optional("one"), Optional(1)))
if let value = tuple.swap() as? (String, Int) {
print("\(value) | \(type(of: value))") // ("one", 1) | (String, Int)
}
我想为 Swift 中的(例如)两个值的元组编写一个扩展。例如,我想写这个 swap
方法:
let t = (1, "one")
let s = t.swap
使得 s
的类型为 (String, Int)
,值为 ("one", 1)
。 (我知道我可以很容易地实现一个 swap(t)
函数,但这不是我感兴趣的。)
我可以这样做吗?我似乎无法在 extension
声明中写出正确的类型名称。
此外,我想答案是一样的,我可以让一个二元组采用给定的协议吗?
您不能在 Swift 中扩展元组类型。 根据 Types,有 命名类型 (其中 可以扩展)和 复合类型 。元组和函数是复合的 类型。
另请参阅(强调):
Extensions
Extensions add new functionality to an existing class, structure, or enumeration type.
正如上面的回答所述,您不能在 Swift 中扩展元组。但是,除了给你一个不,你可以做的是将元组框在 [=11=]、struct
或 enum
中并扩展它。
struct TupleStruct {
var value: (Int, Int)
}
extension TupleStruct : Hashable {
var hashValue: Int {
return hash()
}
func hash() -> Int {
var hash = 23
hash = hash &* 31 &+ value.0
return hash &* 31 &+ value.1
}
}
func ==(lhs: TupleStruct, rhs: TupleStruct) -> Bool {
return lhs.value == rhs.value
}
作为旁注,在 Swift 2.2 中,最多包含 6 个成员的元组现在是 Equatable
。
详情
- Xcode 11.2.1 (11B500), Swift 5.1
解决方案
struct Tuple<T> {
let original: T
private let array: [Mirror.Child]
init(_ value: T) {
self.original = value
array = Array(Mirror(reflecting: original).children)
}
func getAllValues() -> [Any] { array.compactMap { [=10=].value } }
func swap() -> (Any?, Any?)? {
if array.count == 2 { return (array[1].value, array[0].value) }
return nil
}
}
用法
let x = (1, "one")
let tuple = Tuple(x)
print(x) // (1, "one")
print(tuple.swap()) // Optional((Optional("one"), Optional(1)))
if let value = tuple.swap() as? (String, Int) {
print("\(value) | \(type(of: value))") // ("one", 1) | (String, Int)
}