我想扩展Optional
,其中Wrapped
是一个数组(包含任何类型的元素)。换句话说,我想向[Any]?
添加一个函数。我只是不确定如何宣布这一点。我试过了:
1
extension Optional where Wrapped: Array
结果:
error: reference to generic type 'Array' requires arguments in <...>
2
extension Optional where Wrapped: Array<Any>
结果:
type 'Wrapped' constrained to non-protocol type 'Array<Any>'
以及其他各种类似的声明。感谢帮助。
答案 0 :(得分:4)
我有点迟了,但也许我可以帮忙。
在Swift 4中,您可以执行此操作
ms-resource:AppName
如果需要访问数组的Element类型,可以执行以下操作:
extension Optional where Wrapped: Collection {
答案 1 :(得分:1)
是的,这里的问题是,在这一行,
extension Optional where Wrapped: Array<Any>
'Array'应该是一种协议,以更一般的方式:
extension Type where Element: Protocol
我得到的解决方案很丑陋但有效,请考虑一下:
protocol ArrayOfAny {}
struct ArrayAny<Element: Any>: ArrayOfAny {
let array: [Element]
init(_ array: [Element]) {
self.array = array
}
}
因为:
extension Array: ArrayOfAny where Element: Any {}
不受支持......
然后你可以这样做:
extension Optional where Wrapped: ArrayOfAny
希望有所帮助:)
答案 2 :(得分:0)
这个问题的一个更好的解决方案是在 Optional
上像这样使用泛型函数(这里你只在 Optional 中添加函数,如果它真的是一个 Array
):
extension Optional {
mutating func appendAndSetIfNil<E>(_ element: Wrapped.Element) where Wrapped == [E] {
self = (self ?? []) + [element]
}
mutating func appendAndSetIfNil<S>(contentsOf newElements: S) where S: Sequence, Wrapped == [S.Element] {
self = (self ?? []) + newElements
}
}
这只是一个示例,其中 append
函数基本上已被有条件地添加到 Optional
,如果其 Wrapped
类型是 Array
。在这种情况下,此处的值在追加之前从 nil
更改为 []
。
但你可以在这里做任何事情!
请注意,这种方法并非在所有情况下都有效,但在这种情况下,它有效!