Schnelle Arrays enthalten nur einen Typ. Im reinen Swift-Code würde Ihr Beispiel nicht einmal kompilieren. Sie würden den Fehler erhalten: Fehler: Art des Ausdrucks ist mehrdeutig ohne mehr Kontext.
Sie Code kompiliert wird, weil Sie Foundation
importiert haben, entweder weil Sie explizit import Foundation
angegeben, oder weil Sie UIKit
oder Cocoa
von denen jeder importiert Foundation
importiert.
Wenn Foundation
importiert wird, werden gemischte Arrays als NSArray
behandelt, was im Wesentlichen dasselbe ist wie [AnyObject]
. Dies bedeutet, dass alles, was in dieses Array eingefügt wird, eine Instanz einer Klasse sein muss. Da String
eine Struktur ist und Int
und Double
primitive Typen sind, sind sie keine Klassen. Die String
wird zu NSString
befördert, und die Int
und Double
werden in NSNumber
verpackt.
Sie können das sehen, wenn Sie die dynamicTypes
der Werte ausdrucken:
print(mixedTypeArray[0].dynamicType) // _NSContiguousString
print(mixedTypeArray[1].dynamicType) // __NSCFNumber.Type
print(mixedTypeArray[2].dynamicType) // __NSCFNumber.Type
_NSContiguousString
ist eine interne Darstellung eines NSString
. __NSCFNumber.Type
ist eine interne Darstellung von NSNumber
.
Aber das Array selbst enthält nur einen Typ: AnyObject
.
Wenn Sie das tun:
let elementOfApparentlyUnknownType = mixedTypeArray[0] // AnyObject
dann wird der Wert der Typ hat AnyObject
, weil das ist, was das Array zu speichern. Swift schaut nicht, um zu sehen, dass das Element wirklich ein NSString
ist, weil das eine Laufzeitüberlegung ist.Zur Kompilierungszeit verfolgt Swift nicht, dass Sie String
in die Position 0
dieses Arrays setzen. Es weiß nur, dass dieses Array einen Typ NSString
(auch bekannt als) hat.
Die Typen der Variablen sind zur Kompilierzeit in Swift bekannt. Sie können jederzeit Option - Klicken Sie auf eine Variable, um ihren Typ zu sehen. Aus diesem Grund besteht die beste Möglichkeit von Swift darin, die Variable AnyObject
zu erstellen, da sie zur Kompilierungszeit die zugrunde liegenden Typen der Werte in Ihrem Array nicht kennt.
Sie könnten Ihr Array deklariert haben als Typen [Any]
und dann die dynamicTypes
Ihren Wert hätte String
, Int
und Double
geblieben. Aber dann hätte jeder Array-Zugriff eine Variable vom Typ Any
ergeben.
Swift leitet kein Array vom Typ [Any]
ab. Es wird Ihnen nur das geben, wenn Sie ausdrücklich darum bitten. Als eine allgemeine Designregel, wenn Sie sich mit Any
finden, nähern Sie sich wahrscheinlich das Problem in der falschen Weise.