2015-08-01 16 views
6

Rozumiem, jak działają opcje, ale to rzuca mnie za pętlę. Mam zmienną o nazwie num i chcę go zwiększyć, więc zrobiłem następujące:Swift inkrement Int! nie działa

var num:Int! = 0 
num++    //ERROR - Unary operator ++ cannot be applied to an operand of type Int! 

Ale z jakiegoś powodu Swift nie pozwoli mi zwiększyć siła odwinęła Int, mimo że ma być traktowany jak zwykły Int z możliwością zerowania za kulisami. Tak próbowałem następujące, i to działało:

var num:Int! = 0 
num = num + 1  //NO ERROR 

Jednakże, na podstawie komunikatu o błędzie Dało mi, próbowałem następujące, aby operator przyrost nadal działa:

var num:Int! = 0 
num!++   //NO ERROR 

Moje pytanie brzmi: dlaczego pierwszy bit łamie się, gdy drugi i trzeci bit kodu nie? Ponadto, ponieważ num to Int!, czy nie powinienem móc traktować go jak zwykłego Int? Ostatecznie, ponieważ Int! ma być traktowany jak zwykły Int, jak mogę go rozwinąć w trzecim przykładzie? Dzięki.

+1

Od momentu zainicjowania go od razu do "0", nie musi być opcjonalne. Możesz mieć 'var num = 0' bez potrzeby inicjalizacji – Jack

+1

Dzięki za informację, ale niezależnie, dlaczego mój kod jest dziwny? – Aderis

+0

@JackWu: Ustawienie opcjonalne oznacza, że ​​możesz ustawić go na zero, jeśli masz ku temu powód. – gnasher729

Odpowiedz

1

Ten błąd występuje ze wszystkimi parametrami inout i powinno być traktowane jako błąd.

Zwykły sposób działania parametrów inout polega na tym, że ich pobierający zostają wywołani raz, a ich seter przynajmniej raz. W tym przypadku pochłaniacz zwraca Int!:

let num: Int! = 0 
let num2 = num // is inferred to be of type Int! 

tak podpis pochłaniacza/pobierz nie jest taka sama, jak funkcja operatora/oczekuje. Ale kompilator powinien bezwarunkowo rozpakować wartość jeśli zostanie przypisany do Int albo przeszedł tak:

var num3 = 0 // is of type Int 
num3 = num // gets automatically unwrapped 

// also with functions 
func someFunc(i: Int) {} 
someFunc(num) // gets automatically unwrapped 

Sidenote:

Prawie taki sam błąd występuje, jeśli chcesz zdać Int do funkcji ze związkiem inout parametr typu Int!. Ale tutaj jest oczywiste, dlaczego to nie działa (logicznie): Setter z Int nigdy nie bierze nil.

-3

Używasz niewłaściwy typ Int! użyć Int zamiast

+0

Używam go w ViewController, który nie ma metody "init()", a cała moja inicjalizacja jest wykonywana w 'viewDidLoad', więc musi być jakiś opcjonalny i nie chce make it 'Int? ', ponieważ wtedy musiałbym zajmować się znaki zapytania wszędzie i zawsze ma wartość po moim' viewDidLoad' – Aderis

+0

do inicjalizacji w wierszu deklaracji 'var num = 0'. 'Int' to domyślny typ – vadian

+0

Dzięki za informacje, ale niezależnie od tego, dlaczego mój kod z opcjonalnym jest dziwny? – Aderis