2014-06-07 11 views
11

chcę wstawić opcjonalnie w tablicy następującoJak to opcjonalne w tablicy w Swift

let arr: AnyObject[] = [1, 2, nil, 4, 5] 

następujące wyrażenie wyrzuca błąd kompilacji mówiąc

Cannot convert the expression's type 'AnyObject[]' to type 'AnyObject' 

Jak mogę się tej pracy ? Potrzebuję wartości opcjonalnej lub zerowej w tablicy, chociaż wiem, że nie powinienem.

Odpowiedz

5

Właśnie tak:

let arr: AnyObject?[] = [1, 2, nil, 4, 5] 

to sprawia, że ​​tablica typu AnyObject?

4

Nie można używać AnyObject:

18> let ar : AnyObject?[] = [1, 2, nil, 4, 5] 
<REPL>:18:25: error: cannot convert the expression's type 'AnyObject?[]' to type 'AnyObject?' 
let ar : AnyObject?[] = [1, 2, nil, 4, 5] 
         ^~~~~~~~~~~~~~~~~ 

Ale można użyć Any:

18> let ar : Any?[] = [1, 2, nil, 4, 5] 
ar: Any?[] = size=5 { 
    [0] = Some { 
    Some = <read memory from 0x7f8d4b841dc0 failed (0 of 8 bytes read)> 
    } 
    [1] = Some { 
    Some = <read memory from 0x7f8d50da03c0 failed (0 of 8 bytes read)> 
    } 
    [2] = Some { 
    Some = nil 
    } 
    [3] = Some { 
    Some = <read memory from 0x7f8d4be77160 failed (0 of 8 bytes read)> 
    } 
    [4] = Some { 
    Some = <read memory from 0x7f8d4be88480 failed (0 of 8 bytes read)> 
    } 
} 

Dokumentacja firmy Apple sprawia, że ​​to jasne:

„Swift oferuje dwa specjalne aliasy typu pracy z niespecyficznych typów:
o AnyObject może oznaczać wystąpienie dowolnego typu klasy.
o Każdy może reprezentować dowolne wystąpienie dowolnego typu, z wyjątkiem typów funkcji. "

Fragment: Apple Inc." The Swift Programming Language. "IBooks. https://itun.es/us/jEUH0.l

Wydaje się, że Int i prawdopodobnie inne prymitywne typy nie są podtypy typu klasy, a tym samym AnyObject nie będzie działać.

1

To jest oszustwo, ale jeśli używasz zero jako wartownika, może być wskazane użycie tylko krotek, jeden element to Bool, aby powtórzyć ważność drugiego.

var arr = [(true, 1), (true, 2) , (false, 0) , (true, 4),(true,5)] 
17

Jeśli dopiero będzie wstawienie albo Int s lub nil, skorzystaj

Swift < 2,0

var arr: Int?[] = [1, 2, nil, 4, 5] 

Swift> = 2,0

var arr: [Int?] = [1, 2, nil, 4, 5] 

Swift 3x

var arr: Array<Int?> = [1, 2, nil, 4, 5] 

Można to zrobić dla każdego typu (nie tylko Int; to znaczy, jeśli chcesz, aby array utrzymywał określony typ, ale pozwolił na to, by był pusty w niektórych indeksach, np. w kartonie jaj.)

3

let ar: AnyObject[] = [1,2,nil,3] jest niezgodny z prawem, ponieważ nil nie można wymienić na AnyObject.

let a: AnyObject?[] = [1,3,nil,2] lub let a: Int?[] = [1,3,nil,2] działa.

Jeśli trzeba użyć Objective-C do pokonania Array

let a: AnyObject[] = [1, 2, NSNull(), 4, 5]