2016-08-09 31 views
1

Mein Code (Fragment unten) bewirkt, dass der Simulator hängt. Was mache ich falsch?Array von implizit unverpackten Optionalen iteriert für immer in Xcode 8 beta 4

Um das Problem zu reproduzieren, ausschneiden und in den Simulator einfügen.

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

Sie fügen Objekte demselben Array hinzu, über das Sie iterieren. Ihre Frage sieht so aus, als hätten Sie sich nicht die Zeit genommen, sie selbst zu debuggen. – codingFriend1

+0

Vielen Dank für die Rückmeldung CodierungFreund. Das Problem, das ich habe, ist, dass ich ein träge initiiertes Array möchte. Aber das Problem, dem ich gegenüberstehe, ist, dass, wenn ein Array optionale Elemente enthält, die For-Schleife nie beendet wird. Im obigen Code array.count = 1 ... aber die for-Schleife iteriert nach unendlich. – Antony

Antwort

2

Dies ist ein bekannter Fehler, siehe SR-1635. Da ein IUO no longer a distinct type ist, sollte es eigentlich nicht möglich sein, ein Array von ihnen an erster Stelle zu haben.

Dies wird durch die Tatsache bestätigt, dass der folgende Code zu kompilieren, schlägt fehl:

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

(beachten Sie, ich zu Swift Namenskonventionen Ihre Klassennamen entsprechen Ink umbenannt) auf Ihrem

Je Vielleicht möchten Sie stattdessen eine lazy property in Betracht ziehen:

Oder macht das Array selbst ein implizit ungeöffneten optional (und verschieben sowohl die Zuweisung und Initialisierung des Arrays):

var array : [Ink]! 

Obwohl beachten Sie, dass IUOs immer das letzte Mittel aufgrund ihrer inherent unsafety sein sollte.

+0

Danke Hamish für Link die Bug-Datenbank. Ich hatte versucht, in Apples Bugtracker zu suchen, war aber nicht erfolgreich (und es dauert ewig, bis er wiederkommt!). Danke auch für den faulen Vorschlag. Freut mich, dass dies bekannt ist. Ich begann zu denken, dass die Swift3-Konvertierung es erforderlich machen würde, alle for-Schleifen wieder zu 'brechen', wenn 'keine' Elemente gefunden wurden. – Antony

+1

Sieht so aus, als hätte Apple gerade dieses Problem in Xcode Beta 5 behoben. – Antony

+1

@Antony Eigentlich kann ich das noch in Xcode 8 Beta 5 reproduzieren. – Hamish