通过Swift的基础知识,我注意到有两种方法可以向数组添加项目。
一种方法是使用text-decoration: none;
方法,另一种方法是使用.append
运算符(允许添加> 2项数组)。
当您只想将单个项目添加到数组时,使用+=
和+=
之间有什么区别吗?
.append
与
fooArray.append("Bar")
答案 0 :(得分:7)
两个选项完全相同 - 向数组添加值,但+=
允许添加多个值,而.append()
只允许添加一个值
这里有一些代码可以测试哪一个更快地添加单个值
var array: [String] = []
var array2: [String] = []
let time1 = NSDate().timeIntervalSince1970
for i in 0...1000000{
array += ["foobar"]
}
let time2 = NSDate().timeIntervalSince1970
let dif1 = time2 - time1
let time3 = NSDate().timeIntervalSince1970
for i in 0...1000000{
array2.append("foobar")
}
let time4 = NSDate().timeIntervalSince1970
let dif2 = time4 - time3
在iPhone 6s上进行测试,dif1
1.47393365859985 ,dif2
0.385605080127716 ,这是 1.0883285785 < / strong>一百万次重复的秒数。 (100次运行的平均时间)
这意味着只有一次重复,两者之间的差异是.append
约为0.000001088秒,比使用+=
快1.088微秒。
最后,你附加一个值并不重要 - 它只是个人偏好(显然,如果你需要添加一百万个值一个数组,你应该使用.append()
,因为它会明显更快)
Vikingosegundo在撰写此答案时非常有帮助,as per what he said,您可以使用
func +=<T>(inout left:[T], right: T) -> [T]{
left.append(right)
return left
}
充分利用这两个世界 - 这将有效地将array += value
变为array.append(value)
(我相信这曾经是旧版Swift版本中的一项功能,但后来被删除了)
答案 1 :(得分:3)
+=
如何运作? Array
符合CollectionType,因此当您调用+=时,会发生以下情况:
/// Extend `lhs` with the elements of `rhs`.
public func += <Element, C : CollectionType where C.Generator.Element == Element>
(inout lhs: ${Self}<Element>, rhs: C) {
let rhsCount = numericCast(rhs.count) as Int
let oldCount = lhs.count
let capacity = lhs.capacity
let newCount = oldCount + rhsCount
// Ensure uniqueness, mutability, and sufficient storage. Note that
// for consistency, we need unique lhs even if rhs is empty.
lhs.reserveCapacity(
newCount > capacity ?
max(newCount, _growArrayCapacity(capacity))
: newCount)
(lhs._buffer.firstElementAddress + oldCount).initializeFrom(rhs)
lhs._buffer.count = newCount
}
append
如何运作?/// Append `newElement` to the ${Self}.
///
/// - Complexity: Amortized ${O1}.
public mutating func append(newElement: Element) {
_makeUniqueAndReserveCapacityIfNotUnique()
let oldCount = _getCount()
_reserveCapacityAssumingUniqueBuffer(oldCount)
_appendElementAssumeUniqueAndCapacity(oldCount, newElement: newElement)
}
+=
的实现是append
的一般化实现(我不会深入研究append
内的每个调用,但可以随意检查它),因此{在处理一个元素时,{1}}应该会更好。
因此,我选择您认为最适合您的代码库的一个,一致性是关键,如果append
和+=
的性能之间的差异导致您出现问题&# 39;可能正在做一些真的错误。作为思考的食物:
过早优化是所有邪恶的根源 - DonaldKnuth
append
修改:作为附录我个人喜欢vikingosegundo的提案,并会使用它来保持使用public mutating func appendContentsOf<C : CollectionType where C.Generator.Element == Element>(newElements: C) {
self += newElements
}
到处的一致性。
答案 2 :(得分:1)
根据Apple的说法。
您可以通过调用数组的append(_ :)方法将新项添加到数组的末尾:
shoppingList.append("Flour") // shoppingList now contains 3 items, and someone is making pancakes
或者,使用加法赋值运算符(+ =)追加一个或多个兼容项的数组:
shoppingList += ["Baking Powder"] // shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"] // shoppingList now contains 7 items
所以基本上使用append
方法,只有一个选项可以追加一个项目。但是使用+=
运算符,您可以将多个项目作为数组附加。