2014-06-06 16 views
5

Wenn a ist identisch mit c, ist b identisch mit c, warum a ist nicht identisch mit b?Identität Operatoren in Swift

var a = [1, 2, 3] 
var b = a 
var c = a[0...2] 
a === c     // true 
b === c     // true 
a === b     // false 

Wenn a, b, c Konstanten sind:

let a = [1, 2, 3] 
let b = a 
let c = a[0...2] 
a === c     // true 
b === c     // true 
a === b     // true 

Antwort

0

Wie @onevcat sagte, könnte es ein Fehler von Playground sein. Und wenn Sie a in Objekte des Referenztyps ändern, werden alle Identitätstests true sein.

class K {} 
var a = [K(), K(), K()] 
var b = a 
var c = a[0...2] 
a === c     // true 
b === c     // true 
a === b     // true 

es bedeutet, dass a, b & c Aktien die gleiche Lagerung und Elemente.

+0

Vielen Dank und @onevcat. Ich habe meinen Code in eine .swift-Datei kopiert und im Terminal ausgeführt, alle Tests sind wahr. – Tao

+0

Radar eingereicht: http://openradar.appspot.com/radar?id=6240029269557248 rdar: // 17192099 –

0

Interessant, meine Vermutung ist, dass seit c ein var im ersten Fall ist, sein wandelbar und somit eine Kopie zu machen hat. Auf diese Weise, wenn Sie zu c hinzufügen, würde es a nicht ändern. Im zweiten Fall sind sie alle unveränderlich, sodass sie auf den gleichen Speicherplatz zeigen können.

2

Sie können die import Cocoa oder import UIKit entfernen, wenn Sie mit PlayGround spielen, um es richtig zu machen. Es scheint, dass es im Cocoa-Framework eine Art Map-Sache gibt, die Dinge durcheinander bringt. Es sollte ein Fehler sein, denke ich.