Q
在斯威夫特
0
A
回答
1
這是a useless error message;問題是在Collection
上只定義了一個popFirst()
方法。 Here it is:
extension Collection where SubSequence == Self { /// Removes and returns the first element of the collection. /// /// - Returns: The first element of the collection if the collection is /// not empty; otherwise, `nil`. /// /// - Complexity: O(1) @_inlineable public mutating func popFirst() -> Element? { // TODO: swift-3-indexing-model - review the following guard !isEmpty else { return nil } let element = first! self = self[index(after: startIndex)..<endIndex] return element } }
你會發現,它的約束使得Collection
的SubSequence
本身。這對於String
(以及許多其他收集類型,例如Array
和Set
)是不正確的;但這些類型的切片是正確的。
在RangeReplaceableCollection
(其String
符合)上沒有無限制的過載popFirst()
。對此的推理as given by Dave Abrahams in this bug report是popFirst()
應該是O(1);並且在RangeReplaceableCollection
上的實現不能保證(實際上對於String
,這是線性時間)。
對此的另一個好的理由是as mentioned by Leo Dabus,這是popFirst()
不會使集合的索引無效。 RRC的實施將無法保證這一點。
因此,由於語義差異很大,因此不要期望RRC上的popFirst()
超載。你總是可以在RRC定義一個不同的名稱方便的方法爲這個雖然:
extension RangeReplaceableCollection {
/// Removes and returns the first element of the collection.
///
/// Calling this method may invalidate all saved indices of this
/// collection. Do not rely on a previously stored index value after
/// altering a collection with any operation that can change its length.
///
/// - Returns: The first element of the collection if the collection is
/// not empty; otherwise, `nil`.
///
/// - Complexity: O(n)
public mutating func attemptRemoveFirst() -> Element? {
return isEmpty ? nil : removeFirst()
}
}
你會然後說:
func putFirst(_ string: String) {
var str = string
let c = str.attemptRemoveFirst()
print(c)
}
相關問題
- 1. 斯威夫特轉換斯威夫特
- 2. 斯威夫特2斯威夫特3
- 3. 斯威夫特 - JSQMessagesViewController與斯威夫特
- 4. 在斯威夫特
- 5. 在斯威夫特
- 6. 在斯威夫特
- 7. 在斯威夫特
- 8. 在斯威夫特
- 9. 在斯威夫特
- 10. 在斯威夫特
- 11. 在斯威夫特
- 12. 在斯威夫特
- 13. 在斯威夫特
- 14. 在斯威夫特
- 15. 在斯威夫特
- 16. 在斯威夫特
- 17. 在斯威夫特
- 18. 在斯威夫特
- 19. 在斯威夫特
- 20. 在斯威夫特
- 21. 在斯威夫特
- 22. 在斯威夫特
- 23. 在斯威夫特
- 24. 斯威夫特
- 25. 斯威夫特
- 26. 斯威夫特
- 27. 斯威夫特
- 28. 斯威夫特
- 29. 斯威夫特
- 30. 斯威夫特
'讓C = str.first; str.dropFirst()' – vacawama