Swift: Slice startIndex винаги е 0

Сблъсках се с Swift Slice, мислейки, че firstIndex трябва да бъде първият индекс на среза в домейна на източника (не знам за какво друго е полезен). Очевидно това не е така:

let ary = map(1...100) { i in i }

let s:Slice<Int> = ary[10..<20]
s.startIndex            // 0
ary[10..<20].startIndex // 0

(10..<20).startIndex    // 10 (half-open interval generated from a range, presumably)

Това изглежда като грешка? Ако винаги е 0, изглежда напълно безполезно.


person Chris Conover    schedule 02.10.2014    source източник


Отговори (2)


Ако се разровите в автоматично генерирания заглавен файл на Swift (където изглежда, че в момента е по-голямата част от документацията), ще намерите това, описващо Slice:

/// The `Array`-like type that represents a sub-sequence of any
/// `Array`, `ContiguousArray`, or other `Slice`.

Тъй като Slice е подобно на Array, има смисъл startIndex да връща 0, тъй като startIndex на Array винаги ще бъде 0. По-надолу, където дефинира startIndex, ще видите също:

/// Always zero, which is the index of the first element when non-empty.
var startIndex: Int { get }

Ако търсите първия запис в Slice, просто използвайте: s.first:

/// The first element, or `nil` if the array is empty
var first: T? { get }

Ако трябва да намерите индекса в оригиналния Array, където започва Slice, можете да направите нещо подобно:

if let startValue = s.first {
    let index = find(ary, startValue)
    /* ... do something with index ... */
}
person Mike S    schedule 02.10.2014
comment
Добър отговор. Мислех, че прочетох, че това е по-скоро плитко копие - запази препратка към масива. В крайна сметка използвах подхода, който споменахте, но не по избор. Все още мисля, че това е лошо замислено, губите информация и не печелите нищо. - person Chris Conover; 02.10.2014

Това е поправено в Swift 2. Ако нарежете масив с диапазон от 2...5, startIndex на среза ще бъде 2. Много готино.

person phatmann    schedule 26.08.2015
comment
Е, това е доста безполезно. Срезът е прозорец, следователно трябва да има свой собствен индексен диапазон, започващ от 0. - person Erik Aigner; 28.09.2018
comment
След като току-що преминах през научаването по трудния начин, че data.subdata(0..<32) всъщност не връща първите 32 байта данни в swift 5, ме боли да видя, че преди беше толкова просто, но сега не е. Е, моят Extensions.swift файл току-що нарасна с още няколко реда. Блех. - person Potassium Ion; 25.07.2019