Вы также можете расширить RangeReplaceable Collection и реализовать собственный метод добавления, а также операторы сложения и дополнения, как указано ниже:
extension RangeReplaceableCollection {
public mutating func append<S: Sequence>(contentsOf sequence: S?) where Element == S.Element {
guard let sequence = sequence else { return }
reserveCapacity(count + sequence.underestimatedCount)
append(contentsOf: sequence)
}
}
extension RangeReplaceableCollection {
public static func += <S: Sequence>(lhs: inout Self, rhs: S?) where Element == S.Element {
guard let rhs = rhs else { return }
lhs.reserveCapacity(lhs.count + rhs.underestimatedCount)
lhs.append(contentsOf: rhs)
}
}
extension RangeReplaceableCollection {
public static func + <S: Sequence>(lhs: Self, rhs: S?) -> Self where Element == S.Element {
guard let rhs = rhs else { return lhs }
var result = Self()
result.reserveCapacity(lhs.count + rhs.underestimatedCount)
result.append(contentsOf: lhs)
result.append(contentsOf: rhs)
return result
}
}
Тестирование игровой площадки
var a1 = "abc"
let a2: String? = "d"
let a3: String? = nil
let a4: [Character]? = ["e","f"]
a1 + a2 + a3 + a4 // "abcdef"
a1 + a2
print("a1:", a1)
a1 += a2
print("a1:", a1)
a1 + a3
print("a1:", a1)
a1 += a3
print("a1:", a1)
a1 + a4
print("a1:", a1)
a1 += a4
print("a1:", a1)
a1.append(contentsOf: ["e","f","g"])
print("a1:", a1)
a1.append(contentsOf: "hijkl")
print("a1:", a1)