我想在Swift中为(例如)两个值的元组编写扩展名。例如,我想写这个swap
方法:
let t = (1, "one")
let s = t.swap
s
类型(String, Int)
的值为("one", 1)
。 (我知道我可以很容易地实现swap(t)
功能,但这不是我感兴趣的。)
我可以这样做吗?我似乎无法在extension
声明中写出正确的类型名称。
另外,我想答案是一样的,我可以让2元组采用给定的协议吗?
答案 0 :(得分:29)
你不能在Swift中扩展元组类型。 根据 Types,有命名类型(其中 可以扩展)和复合类型。元组和函数是复合的 类型。
另见(重点补充):
Extensions
扩展程序为现有功能添加新功能 类,结构或枚举类型。
答案 1 :(得分:5)
正如上面的答案所述,你不能在Swift中扩展元组。但是,您可以做的就是将元组放在<Compile Include="MainForm.ContextActions.cs" />
,<Compile Include="MainForm.ContextActions.cs">
<DependentUpon>MainForm.cs</DepedentUpon>
</Compile>
或class
内并扩展它。而不仅仅是给你一个否,你可以做的就是把它组合起来。
struct
作为旁注,在Swift 2.2中,最多包含6个成员的元组现在是enum
。
答案 2 :(得分:0)
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)
}