Swift:扩展可选数组

时间:2016-11-04 16:26:08

标签: swift generics optional

我想扩展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>'

以及其他各种类似的声明。感谢帮助。

3 个答案:

答案 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 更改为 []

但你可以在这里做任何事情!

请注意,这种方法并非在所有情况下都有效,但在这种情况下,它有效!