2017-08-10 78 views
1
let range = 3..<3 // lowerBound == upperBound 

這種類型的範圍由Swift標準庫在多個地方使用,例如在數組insert(_, at:)方法中。爲什麼允許CountableRange具有相同的lowerBound和upperBound?

Arrays.swift.gyb

@_inlineable 
public mutating func insert(_ newElement: Element, at i: Int) { 
    _checkIndex(i) 
    self.replaceSubrange(i..<i, with: CollectionOfOne(newElement)) 
} 

當我們寫

let range = 5...5 // CountableClosedRange 
range.lowerBound // returns 5 
range.upperBound // returns 5 

這意味着,我們希望有一個範圍,僅包括一個索引的5

但是,當我們寫

let range = 5..<5 // CountableRange 
range.lowerBound // returns 5 
range.upperBound // returns 5 

我們如何解釋這一點?

簡而言之:如果範圍5...5代表指數5,什麼範圍5..<5代表什麼?

+1

這有什麼奇怪的?這是一個空的範圍。當用它調用'replaceSubrange'時,你說你不希望任何元素被替換;你只是想插入新的。 – Hamish

+0

@Hamish如果範圍'5 ... 5'代表索引'5',範圍'5 .. <5'代表什麼? –

+1

一個空的範圍:) – Hamish

回答

2

總之:如果範圍5...5代表指數5,是什麼範圍5..<5代表什麼?

5..<5起始於位置5空範圍。你可以驗證它是空的,:

print((5..<5).isEmpty) // true 

但要注意:

(5..<5) != (6..<6) 

,因爲他們開始在不同的地方。

正如你在你的問題中指出的那樣,一個空的範圍可以用於指定一個位置。在replaceWithSubrange它可以用來指定插入值的位置。

實施例:

var letters = ["a", "b", "c"] 

letters.replaceSubrange(1..<1, with: ["x", "x", "x"]) 

print(letters) 
["a", "x", "x", "x", "b", "c"] 

這告訴replaceSubrange替換的開始爲0的計數位置1 ["x", "x", "x"]字母的範圍內。換句話說,在位置1之前插入新值。


雖然你不會看到文字範圍如(5..<5)多的代碼,也常發生在代碼中for循環例如空範圍:

for i in 0 ..< array.count { 
    // do something with i 
} 

在這種情況下,如果陣列是空的,範圍將沒有值,並且for循環將不會執行。

+0

哇!嚴重的是,我不是故意複製你的答案:D –

+0

@AhmadF LOL。如果你確實複製了它,你在23秒內完成了,除非你是一個機器人,否則這個速度非常快。 :-) – vacawama

1

簡而言之:如果範圍5...5代表指數5,是什麼範圍5..<5 代表什麼?

只是空的範圍。

爲:

let range = 5..<5 

,如果你想檢查它是否是空的,你應該得到true

range.isEmpty //true 

考慮:

let range = 5..<5 
let testingArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
let value = testingArray[range] 

在這種情況下,value會一個ArraySlice其中包含元素。

相關問題