2015-03-04 4 views
2

Этот метод работает нормально в последней стабильной версии Swift, но он не будет компилировать в Swift 1.2:Swift 1,2 «Невозможно выразить преобразование кортежа» ошибка

final func rotateBlocks(orientation: Orientation) { 
    if let blockRowColumnTranslation:Array<(columnDiff: Int, rowDiff: Int)> = blockRowColumnPositions[orientation] { 
     for (idx, (columnDiff:Int, rowDiff:Int)) in enumerate(blockRowColumnTranslation) { 
      blocks[idx].column = column + columnDiff 
      blocks[idx].row = row + rowDiff 
     } 
    } 
} 

Эта линия:

for (idx, (columnDiff:Int, rowDiff:Int)) in enumerate(blockRowColumnTranslation) { 

Выдает следующую ошибку:

"Cannot express tuple conversion "(index:Int, element:(columnDiff:Int,rowDiff:Int)) to "(Int, (Int, Int))"

Любые идеи о том, что здесь происходит, и как это исправить?

+0

Я получил код для компиляции в Swift 1.2, но должен был сделать много догадок относительно точных деклараций и/или предполагаемых типов неуказанных типов '' blockRowColumnPositions', ориентацию 'и т. д. Отделите его до полного файла, который * должен * (/ did) скомпилировать. – BaseZen

ответ

1

Похож на Быструю ошибку. В целом, это лопнул:

let pair = (a: 1, b: 2) 
// normally those named elements don't matter, this is fine: 
let (x,y) = pair 
// but add a bit of nesting: 
let indexed = (index: 1, pair) 
// and, error: 
let (i, (x,y)) = indexed 
// cannot express tuple conversion '(index: Int, (a: Int, b: Int))' to '(Int, (Int, Int))' 

Я бы попробовать удалить имена типов из декларации кортежа массива (т.е. Array<(Int,Int)> вместо Array<(columnDiff: Int, rowDiff: Int)>), увидеть, если это помогает.

В других, возможно, связанных, новостях, это, кажется, сбою 1.2 компилятора:

let a: Array<(Int,Int)> = [(x: 1,y: 2)] 
+0

Я тоже получил segfault :-( – BaseZen

3

Я хотел бы использовать typealias для упрощения, но следующие компилируется без ошибок для меня.

var row: Int = 0 
var column: Int = 1 
struct block { 
    var column: Int 
    var row: Int 
} 
var blocks = [block]() 

enum Orientation { case Up; case Down; } 
typealias Diff = (columnDiff: Int, rowDiff: Int) 
typealias DiffArray = Array<Diff> 
typealias DiffArrayDict = [Orientation: DiffArray] 

var blockRowColumnPositions = DiffArrayDict(); 

func rotateBlocks(orientation: Orientation) { 
    if let blockRowColumnTranslation: DiffArray = blockRowColumnPositions[orientation] { 
     for (idx, diff) in enumerate(blockRowColumnTranslation) { 
      blocks[idx].column = column + diff.columnDiff 
      blocks[idx].row = row + diff.rowDiff 
     } 
    } 
} 
1

Спасибо, ребята! Я завелся просто переписать его как для петли .. это не интересно, но это, кажется, работает хорошо:

final func rotateBlocks(orientation: Orientation) { 

    if let blockRowColumnTranslation:Array<(columnDiff: Int, rowDiff: Int)> = blockRowColumnPositions[orientation] { 

     for var idx = 0; idx < blockRowColumnTranslation.count; idx++ 
      { 
      let tuple = blockRowColumnTranslation[idx] 
      blocks[idx].column = column + tuple.columnDiff 
      blocks[idx].row = row + tuple.rowDiff 
     } 
    } 
} 
+0

Если вам становится лучше, вы можете переписать это 'for' как' для idx в индексах (blockRowColumnTranslation) {} ' –

+0

Что случилось с моим? Также для согласованности почему бы не оставить 'blocks' как массив кортежей и делать это в одном присваивании? – BaseZen

+0

В этом отношении по-настоящему быстрый способ состоит в том, чтобы передать блок (закрытие) на' map' – BaseZen

3

Я столкнулся с теми же вещами, и был в состоянии получить эту работу, добавив element: ярлык для кортеж:

for (idx, element: (columnDiff: Int, rowDiff: Int)) in enumerate(blockRowColumnTranslation) { 
    blocks[idx].column = column + element.columnDiff 
    blocks[idx].row = row + element.rowDiff 
} 
+0

Это путь! (в соответствии с ошибкой в ​​быстром) – Reshad

+0

Теперь, если кто-нибудь может объяснить, почему метка 'element:' требуется, но индекс 'index:' не является, это было бы полезно :) –

-1
final func rotateBlocks(orientation: Orientation) { 
    if let blockRowColumnTranslation = blockRowColumnPositions[orientation] { 
     for (idx, diff) in enumerate(blockRowColumnTranslation) { 
      blocks[idx].column = column + diff.colunmDiff 
      blocks[idx].row = row + diff.rowDiff 
     } 
    } 
} 
Смежные вопросы