【问题标题】:Swift: Extend Optional ArraySwift:扩展可选数组
【发布时间】:2016-11-04 16:26:07
【问题描述】:

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

和其他各种类似的声明。感谢您的帮助。

【问题讨论】:

  • 这个扩展究竟是什么?换句话说,您希望只添加到[Any]? 的功能是什么?
  • 我想添加一个便利函数,1) 如果数组为非 nil,则追加一个元素;2) 如果数组为 nil,则仅使用元素初始化数组。
  • @ConnorNeville 你的意思是array = (array ?? []) + [element]? IMO 真的不值得扩展(考虑到您必须经历的变通方法才能使其工作)。
  • 多哈。这比我反复写的要简洁得多。我会这样做的,谢谢。
  • @ConnorNeville 没问题 :) 虽然我觉得有必要质疑可选数组的使用,但它不可能只是一个非可选的空数组吗?

标签: swift generics optional


【解决方案1】:

我有点晚了,但也许我可以帮忙。

在 swift 4 中,你可以这样做

extension Optional where Wrapped: Collection {

如果你需要访问数组的元素类型你可以这样做:

Wrapped.Iterator.Element

【讨论】:

  • 感谢您向我指出 Collection 协议,这正是我所需要的
【解决方案2】:

是的,这里的问题是在这一行中,

extension Optional where Wrapped: Array<Any>

“数组”应该是一个协议,以更一般的方式:

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

希望对你有帮助:)

【讨论】:

    【解决方案3】:

    解决这个问题的更好方法是像这样在Optional 上使用泛型函数(如果它真的是Array,你只是在 Optional 中添加函数):

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多