2014-06-10 26 views
10

slightly tweaked to be generic adresinden Matrix örneği için bir uzantı yazmaya çalışıyorum.
Verilen satırda bir değer dizisi döndüren getRow adlı bir yöntem yazmaya çalışıyorum. C#Swift'de bir diziyi nasıl döndürebilirim?

, ben bu yazılı olurdu:

IEnumerable<T> GetRow (int row) 
{ 
    return Enumerable 
     .Range (0, this.columns) 
     .Select ((column) => this.grid[row, columns]); 
} 

veya alternatif

IEnumerable<T> GetRow (int row) 
{ 
    for (var column = 0; column < this.columns; column++) { 
     yield return this.grid[row, column]; 
    } 
} 

olsa Swift de bunun nasıl emin değilim.

Sequence

IEnumerable<T> eşdeğer gibi görünüyor ama typealias kullandığı yerine sadece Sequence<T> ( see also this) olarak tanımlanır ancak neden anlamıyorum.

Sonra (ancak genel olması gerekiyordu nasıl?) <T> kurtuldum
extension Matrix { 
    // Cannot specialize non-generic type 'Sequence' 
    func getRow<T>(index: Int) -> Sequence<T> { 
     return map(0..self.columns, { self[index, $0] }) 
    } 
} 

: Bu derler

extension Matrix { 
    func getRow(index: Int) -> Sequence { 
     return map(0..self.columns, { self[index, $0] }) 
    } 
} 

işe yaramadı jenerik Sequence<T> döndüren bir yöntem tanımlama! Ancak bunu kullanamazsınız: Bir for..in döngü içinde tüketilebilir böylece

var row = grid.getRow(0) 
// 'Sequence' does not conform to protocol '_Sequence_' 
for i in row { 
    println("\(i)") 
} 

nasıl düzgün bir map sonucu yazabilirim? Bu konudaki

Daha: Associated Type Considered Weird

cevap

9

Joe Groff suggested:

uygulama benim için çalışıyor bu işleri, Nitekim

extension Matrix { 
    func getRow(index: Int) -> SequenceOf<T> { 
     return SequenceOf(map(0..self.columns, { self[index, $0] })) 
    } 
} 

ama biz yardımcı sınıfa map sonucu kaydırmak zorunda olan C# nasıl yaptığından farklıdır.

ben henüz anlamadım neden Sequence ve Generator kullanım typealias ve jenerik protokolleri (gibi IEnumerable<T> C#) değillerdir itiraf etmeliyim.

  1. Associated Types Considered Weird
  2. Associated types vs. type parameters - reason for the former?
  3. Abstract Type Members versus Generic Type Parameters in Scala
  4. Generics and protocols
+0

Tüm bu bağlantılar için teşekkürler - çok takdir. – ColinE

+0

SequenceOf'un Swift'in son sürümlerinden kaldırıldığını unutmayın. –

1

Sana (şu anda biraz pul pul) Swift derleyici tarafından yanlış yönlendirildiği düşünüyorum. 0..self.columns aralığınızın türü Sequence veya Collection değil Range<Int>, bu yüzden map aracılığıyla kullanılabileceğini düşünmüyorum. SequenceOf<T> sonucu sarmak için

extension Matrix { 
    func getRow(index: Int) -> T[] { 
    var row = T[]() 
    for col in 0..self.columns { 
     row.append(self[index, col]) 
    } 
    return row 
    } 
} 
+0

dosyalayamıyorum edeceğiz: Ben meraklı bir zihin için birkaç bağlantı bırakacağım bu yüzden bu ayrım ilgili ilginç sürmekte olan tartışmalar vardır bir radar ... Sıralı olsa nasıl tembel tutarım? –

+0

@Dan tembel mi? Bir dizi üzerinde bir harita gerçekleştirir, ancak sonuçlarla hiçbir şey yapmazsam, kapanış hala tüm dizi değerleri için yürütülür. – ColinE

+0

Garip! Bir dizi döndürmezse, o zaman tembel olmalı diye düşündüm. Bunu kontrol edeceğim. –

İlgili konular