Soru Dizin Aralığı Swift'den Yeni Dizi


Böyle bir şeyi nasıl yapabilirim? Bir diziden ilk n öğeleri alın:

newNumbers = numbers[0..n]

Şu anda aşağıdaki hatayı alıyoruz:

error: could not find an overload for 'subscript' that accepts the supplied arguments

DÜZENLE:

İşte çalıştığım fonksiyon.

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = numbers[0...position]
    return newNumbers
}

76
2018-06-04 09:58


Menşei




Cevaplar:


Bu benim için çalışıyor:

var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]

Sorununuz, dizininizin başlangıç ​​olarak nasıl bildirildiğiyle ilgili olabilir.

DÜZENLE:

İşinizi düzeltmek için, Slice bir diziye

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = Array(numbers[0..<position])
    return newNumbers
}

// test
aFunction([1, 2, 3], 2) // returns [1, 2]

122
2018-06-04 10:01



Soruma biraz daha bağlam ekledim, bir işlevin içinde çalışıyorum. Bu bağımsız çalışır, ancak işlevin içinde değil. - Charlie Egan
Cevabımı güncelledim. - Cezary Wojcik
Güzel! Şerefe - bu işe yarıyor. Bana izin verdiğinde cevabı kabul edeceğim. - Charlie Egan
Pedantic noktası, ama bu gerçekten değil döküm  Slice bir Arrayancak bir dilimden yeni bir dizi oluşturmak yerine. Bir oyuncu kullanırdı as Şebeke: numbers as Array bir hataya neden olur. - Jamie Bullock
İki nokta.. olarak değiştirildi ..<; üç nokta (bir elips) aynı kaldı. Hatırlattığınız için teşekkürler; Cevabı güncelledim. - Cezary Wojcik


Swift 4 ile yazarken:

let newNumbers = numbers[0...position]

newNumbers türü değil Array<Int> ama tipi ArraySlice<Int>. O yüzden Array'ler subscript(_:​) bir döndürür ArraySlice<Element> Apple'a göre, bazı büyük dizilerin depolanması üzerine bir görüş sunar.

Ayrıca, Swift ayrıca bir sağlar init(_:​) başlatıcısı Array Bu, yeni bir dizi oluşturmamızı sağlar. sequence (dahil olmak üzere ArraySlice).

Bu nedenle, ilk olarak yeni bir dizi almak için aşağıdaki dört yoldan birini kullanabilirsiniz. n bir dizinin elemanları.


# 1. kullanma Array aralıklı alt simge

Kullanabilirsiniz Array altyazı CountableRange, CountableClosedRange, PartialRangeUpTo veya partialRangeThrough Bir dizinin ilk elemanlarının bir alt dizisini elde etmek için.

Kullanımı: 

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[..<3] // using PartialRangeUpTo
//let arraySlice = array[...2] // using PartialRangeThrough
//let arraySlice = array[0..<3] // using CountableRange
//let arraySlice = array[0...2] // using CountableClosedRange
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

# 2. kullanma Array'ler prefix(_:) yöntem

Swift bir sağlar prefix(_:) uygun olan türleri için yöntem Collection protokolü (dahil olmak üzere Array). prefix(_:) aşağıdaki beyanı var:

func prefix(_ maxLength: Int) -> ArraySlice<Element>

İlk öğeleri içeren uzunluktaki maxLength'a kadar bir alt dizge döndürür.

Apple ayrıca şunları söylüyor:

Maksimum uzunluk, koleksiyondaki öğe sayısını aşarsa, sonuç koleksiyondaki tüm öğeleri içerir.

Kullanımı: 

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array.prefix(3)
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

3.. Özel bir global işlev oluşturma

Aşağıdaki Oyun Alanı kodu, ilkini döndüren global bir işlev oluşturmak için gösterilmektedir. n bir unsurları Array:

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    let newNumbers = numbers[0 ..< position]
    return Array(newNumbers)
}

let array = Array(10...14) // [10, 11, 12, 13, 14]
let newArray = aFunction(numbers: array, position: 3)
print(newArray) // prints [10, 11, 12]

4.. Bir Array uzantı özel yöntem

Aşağıdaki Oyun Alanı kodu, bir Array İlkini döndüren uzantı özel yöntemi n bir unsurları Array:

extension Array {

    func getFirstElements(upTo position: Int) -> Array<Element> {
        let arraySlice = self[0 ..< position]
        return Array(arraySlice)
    }

}

let array = Array(10...14) // [10, 11, 12, 13, 14]
let newArray = array.getFirstElements(upTo: 3)
print(newArray) // prints [10, 11, 12]

64
2017-12-15 22:43





func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}

4
2018-06-01 06:05



Lütfen cevaba da bazı açıklamalar ekleyin. - nullpointer
Çok güzel cevap. Esasen yaptığı şey, bir ArraySlice <T> 'i bir Diziye çevirmesidir. Şahsen çok fazla iddia içermezdim. Yanlış aralık vb. Sağladığımda genellikle dilimin kesilmesini istiyorum. - eonist