2016-08-09 8 views
1

私のコード(以下の断片)は、シミュレータをハングさせます。 私は何が間違っていますか?暗黙のうちにアンラップされたオプションの配列は、Xcode 8 beta 4で永久に反復されます。

問題を再現するには、シミュレータに切り取り、貼り付けます。

class INK 
{ 
    var test = 1 
} 

var array = [INK!](repeating: nil, count: 1) 

for idx in 0..<array.count 
{ 
    array[idx] = INK() 
} 

var idx2 = 0 
for ink_item in array 
{ 
    idx2 += 1 
    print("idx2=\(idx2)") 
} 
+1

反復処理している同じ配列にアイテムを追加しています。 自分でデバッグする時間がかかりませんでした。 – codingFriend1

+0

フィードバックコーディングのお友達に感謝します。私が持っている問題は、遅れて開始された配列が欲しいということです。しかし、私が直面している問題は、配列内にオプションの項目がある場合です。forループは終了しません。上のコードでは、array.count = 1 ...ですが、forループが無限に反復します。 – Antony

答えて

2

これは既知のバグです。SR-1635を参照してください。 IUOはno longer a distinct typeなので、最初はIUOの配列を持つことはできません。

これは、次のコードはコンパイルに失敗したという事実によって確認されている:あなたによって

// compiler error: Implicitly unwrapped optionals are only allowed at top level. 
// and as function results 
var array: [Ink!] = [] 

(私はスウィフト命名規則に準拠するようにInkに自分のクラス名に改名注意)

代わりにlazy propertyを使用することを検討してください。

lazy var array : [Ink] = { 

    var array = [Ink]() 

    // populate array 

    return array 
}() 

または(および配列の割り当てと初期化の両方を延期する)オプションの配列自体が暗黙のうちに開封された作り:

var array : [Ink]! 

ノートがIUOsは常にそれらのinherent unsafetyに最後の手段でなければならないこと。

+0

バグデータベースをリンクしていただきありがとうございます。私はAppleのバグトラッカーで検索を試みましたが、失敗しました(そしてそれはいつまでも戻ってくる!)。怠惰な提案にも感謝します。これは既知の問題だとうれしいです。私は、Swift3の変換が、 '無条件'の項目に遭遇したときにfor forループをすべて「再開」する必要があると考え始めました。 – Antony

+1

アップルのように見えるのは、Xcode Beta 5でこの問題を修正した.... – Antony

+1

@Antony実際、Xcode 8 Beta 5でもこれを再現できます。 – Hamish

関連する問題