+ =和append之间的区别是将单个项添加到数组?

时间:2016-01-10 01:12:08

标签: ios arrays swift

通过Swift的基础知识,我注意到有两种方法可以向数组添加项目。

一种方法是使用text-decoration: none; 方法,另一种方法是使用.append运算符(允许添加> 2项数组)。

当您只想将单个项目添加到数组时,使用+=+=之间有什么区别吗?

.append

fooArray.append("Bar")

3 个答案:

答案 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

Fun fact

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方法,只有一个选项可以追加一个项目。但是使用+=运算符,您可以将多个项目作为数组附加。