我想在 Swift 中为(例如)两个值的元组编写一个扩展。例如,我想写这个swap
方法:
let t = (1, "one")
let s = t.swap
这样这s
将是(String, Int)
具有 value的类型("one", 1)
。(我知道我可以很容易地实现一个swap(t)
函数,但这不是我感兴趣的。)
我可以这样做吗?我似乎无法在extension
声明中写出正确的类型名称。
另外,我想答案是一样的,我可以让一个 2 元组采用给定的协议吗?
我想在 Swift 中为(例如)两个值的元组编写一个扩展。例如,我想写这个swap
方法:
let t = (1, "one")
let s = t.swap
这样这s
将是(String, Int)
具有 value的类型("one", 1)
。(我知道我可以很容易地实现一个swap(t)
函数,但这不是我感兴趣的。)
我可以这样做吗?我似乎无法在extension
声明中写出正确的类型名称。
另外,我想答案是一样的,我可以让一个 2 元组采用给定的协议吗?
正如上面的答案所述,您不能在 Swift 中扩展元组。然而,你可以做的不仅仅是给你一个不,你可以做的是将元组装在 aclass
中,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
.
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 { $0.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)
}