如何向 Swift 数组添加扩展以有条件地追加?

Posted

技术标签:

【中文标题】如何向 Swift 数组添加扩展以有条件地追加?【英文标题】:How to Add an Extension to Swift Array To Conditionally Append? 【发布时间】:2017-02-09 12:08:31 【问题描述】:

有没有办法将其作为 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)

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

【问题讨论】:

【参考方案1】:

这应该可行:

extension Array 

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

条件转换newElement as? Element 成功,如果 新元素符合或是数组元素类型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]

【讨论】:

【参考方案2】:

其实答案是正确的,但可能不是你想要的:

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

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

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

【讨论】:

以上是关于如何向 Swift 数组添加扩展以有条件地追加?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 automake 和 autoconf 以有条件地构建程序(测试或其他)

反应路由器链接以有条件地渲染按钮

Swift将对象添加到数组会追加副本而不是引用? [复制]

将 PostgreSQL 函数包装在另一个中以有条件地组合结果

估计浏览器 JS 引擎速度以有条件地禁用动画

UICollectionview 将数据追加到数组 Swift