有没有办法将此作为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)
答案 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]
的数组中,则会看到错误。