2014-06-16 22 views

Odpowiedz

17

Od REPL

xcrun swift 
    1> import Foundation 
    2> var test = ["a", "b", true, "hi", 1] 
test: __NSArrayI = @"5 objects" { 
    [0] = "a" 
    [1] = "b" 
    [2] = 
    [3] = "hi" 
    [4] = (long)1 
} 
    3> 

widać test jest NSArray, który jest rodzajem AnyObject[] lub NSObject[]

Co dzieje, że Foundation zapewnia możliwość konwersji numeru i Boolean w NSNumber. Kompilator wykona konwersję, gdy będzie to wymagane do kompilacji kodu.

więc mają teraz wspólny typ NSObject a zatem wywnioskować jak NSArray


Twój kod nie skompilować w REPL bez import Foundation.

var test = ["a", "b", true, "hi", 1] 
<REPL>:1:12: error: cannot convert the expression's type 'Array' to type 'ArrayLiteralConvertible' 

var test:Array = ["a", "b", true, "hi", 1] 
<REPL>:4:18: error: cannot convert the expression's type 'Array' to type 'ExtendedGraphemeClusterLiteralConvertible' 

ale można to zrobić

var test : Any[] = ["a", "b", true, "hi", 1] 

Bo one mają wspólny typ, który jest Any.


Uwaga: AnyObject[] nie będzie działać bez import Foundation.

var test:AnyObject[] = ["a", "b", true, "hi", 1] 
<REPL>:2:24: error: type 'Bool' does not conform to protocol 'AnyObject' 
+0

To znaczy, AnyObject? – Boon

+0

AnyObject jest typem – juniperi

+0

Czy istnieje sposób sprawdzenia wywnioskowanego typu tablicy? – Boon

1

Opis jest poprawny, tablica przechowuje wiele wartości tego samego typu. Kluczem jest to, że jedna wartość ma wiele typów. To jest, na przykład, String ma typy String i Any; instancja klasy Ellipse : Shape ma typy Ellipse, Shape, AnyObject i Any.

14> class Foo {} 
15> class Bar : Foo {} 
16> var ar1 : Array<Any> = [1, "abc", Foo(), Bar()] 
ar1: Any[] = size=4 { 
    [0] = <read memory from 0x7fa68a4e67b0 failed (0 of 8 bytes read)> 
    [1] = { ... } 
    [2] = {} 
    [3] = { ... } 
} 
17> ar1[0] 
$R5: Int = <read memory from 0x7fa68a51e3c0 failed (0 of 8 bytes read)> 
18> ar1[1] 
$R6: String = { ... } 
19> ar1[2] 
$R7: Foo = {} 
20> ar1[3] 
$R8: Bar = { 
    lldb_expr_14.Foo = {} 
} 
21> ar1[0] as Int 
$R9: Int = 1 
2

AnyObject to rodzaj można utworzyć tablicę, która przechowuje te, które (jak sugeruje nazwa klasy) oznacza, że ​​może posiadać dowolny typ obiektu. NSArrays nie są związane z typem, a gdy tworzysz tablicę z typami mieszanymi, wygeneruje ona NSArray zamiast Array. Nie będę jednak polegał na tym, ponieważ może się on zmienić w przyszłości (AnyObject [] jest automatycznie mostkowany z NSArray).

Można spróbować to na placu zabaw (Uwaga: dynamicType powraca „(Metatype)” i nie byłem pewien, jak wyciągnąć faktycznie wpisać więc powoływać się na błąd kompilatora):

var x = [ 1, 2, "a" ] 
x.dynamicType.description() // -> __NSArrayI 

var y = [ 1, 2 ] 
y.dynamicType.description() // -> Error: Array<Int>.Type does not have a member named 'description'. 

var z: AnyObject[] = [ 1, 2, "a" ] 
z.dynamicType.description() // -> Error: Array<AnyObject>.Type does not have a member named 'description'. 
+0

Martin, nie mogę uzyskać x.dynamicType.description() do kompilacji w Xcode. – Boon

+0

Dzięki Martin, dobry test. – Boon

3

Aby zainicjować Array z dowolnymi typami, po prostu użyj var arbitraryArray = [Any]().

0

w Swift 3 można użyć:

var testArray = ["a",true,3,"b"] as [Any] 
Powiązane problemy