如何添加扩展到Swift数组有条件地附加?

时间:2017-02-09 12:08:31

标签: arrays swift generics swift3 generic-collections

有没有办法将此作为Array的扩展,而不是一个可以增长和增长的switch语句?

    fileprivate var exteriorColorOptions = [ExteriorColorOption]()
    fileprivate var otherOptions = [SomeOtherOption]()
      : more options

    func add(option:FilteredOption) {

        switch(option) {
        case let thing as ExteriorColorOption:
                exteriorColorOptions.append(thing)
        case and on and on
        default:
            break
        }
    }

我希望能够在正确的扩展位置下执行以下操作:

exteriorColorOptions.appendIfPossible(option)
otherOptions.appendIfPossible(option)

注意:切换方法来自 Swift: Test class type in switch statement

2 个答案:

答案 0 :(得分:1)

这应该有效:

extension Array {

    mutating func appendIfPossible<T>(newElement: T) {
        if let e = newElement as? Element {
            append(e)
        }
    }
}

条件转换newElement as? Element如果成功则成功 new元素符合或是数组元素类型Element的(子类)的实例。

示例:

class A {}
class B: A {}
class C {}

var array: [A] = []

array.appendIfPossible(newElement: B())
print(array) // [B]

array.appendIfPossible(newElement: C())
print(array) // [B]

答案 1 :(得分:0)

实际上答案是正确的,但可能不完全是您想要的:

  extension Array {
    mutating func safeAppend(newElement: Element?) {
      if let element = newElement {
        append(element)
    }
  }

如果您尝试追加一个不是数组原始类型的元素,这将引发编译时错误。

例如如果您尝试将Int附加到字符串[String]的数组中,则会看到错误。