2014-07-19 10 views
6

W func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{Swift: rozpakowaniu przyczyną Swift skompilować powoli

ta linia kodu sprawia szybkiej kompilacji bardzo powolne:

cell!.detailTextLabel.text = child.year! + " " + child.make! + " " + child.model! 

zajmuje mi 1 min i 44 sek do budowania projektu, czy mam ten wiersz kodu. I 99% czasu utknął w "Kompilowanie plików źródłowych Swift". Jeśli zmienić tę linię do

cell!.detailTextLabel.text = " "//child.year! + " " + child.make! + " " + child.model! 

To tylko zajmie mi 5 lub 6 sekund do budowania projektu. Chciałbym wiedzieć, dlaczego ten wiersz kodu spowoduje kompilację czasu.

W moim modelu dziecka, są one zgłoszone jako:

var name:String? 
var year:String? 
var make:String? 
var model:String? 

i init:

init(name:String!, ... ,year:String!, make:String!, model:String!, ...){ 
     self.name = name 
     ... 
     self.year = year 
     self.make = make 
     self.model = model 
} 

Część I skonstruowania dziecko:

Child(name:cName,...,year:cYear,make:cMake, model:cModel,...) 
+0

Nie należy zadawać dwóch pytań w jednym. Problem powolnej kompilacji to pytanie. Kiedy rozpakowanie jest konieczne, to inne pytanie! Jeśli zadasz drugie pytanie osobno, postaram się odpowiedzieć osobno. – matt

+0

@matt Dzięki, zobacz moje drugie pytanie tutaj.http: //stackoverflow.com/questions/24844495/swfit-strange-behavior-about-unwrapping – fuiiii

Odpowiedz

4

Tak, złożony raport o błędzie (17585851) dotyczący tego powolnego problemu kompilacji i powinieneś zrobić to samo; im bardziej jasne są przypadki użycia Apple, tym lepiej. Mój kod był powolny kilka wystąpień tego formularza:

let title = obj.valueForProperty(MPMediaItemPropertyTitle) as? String 
self.titles += title ? title! : "" 

(która, jak widać, robi badania nil/rozpakowaniu). To było uciążliwe, ale nie było trudne dla mnie, aby obejść problem, robiąc to samo w inny sposób, i powinieneś zrobić to samo. Ale najpierw zgłoś ten raport o błędzie!

+1

W jaki sposób zrobiłeś to w inny sposób i sprawiłeś, że kompilacja jest szybsza? I jak mogę wysłać błąd do Apple? Dzięki! – fuiiii

+0

@fuiiii Możesz zgłosić błąd na http://bugreport.apple.com – Jason

+0

@Jason zrobiłem, dzięki! – fuiiii

0

Musisz rozpakować, gdy typy są zadeklarowane jako opcje. W szybkim typie opcjonalnym jest typ, który może ale nie musi mieć wartości. Na przykład mógłbym zadeklarować ciąg znaków jako:

var collegeName: String?

"?" na końcu deklaracji typu pokazuje, że nazwa uczelni może mieć wartość lub nie, a aby uzyskać tę wartość, trzeba ją rozwinąć, aby uzyskać jej wartość za pomocą! operator.

O ile mogę powiedzieć w twoim przypadku, pole nazwy jest zadeklarowane jako ciąg znaków w ciągu roku, marka i model są zadeklarowane jako opcjonalne ciągi, dlatego musisz rozwinąć te pola, aby uzyskać z nich wartość.

Możesz również zadeklarować typ za pomocą "!" operator taki jak:

var collegeName: String!

Oznacza to, że jest to opcjonalny ciąg znaków, ale jest on automatycznie rozpakowywany, więc nie trzeba używać "!" później, aby rozwinąć to opcjonalne.

+0

Zgadzam się z tym, co mówisz o opcjach. Nazwa dziecka została również zadeklarowana jako opcjonalna. Dlatego jestem zdezorientowany, ponieważ nie muszę go rozpakowywać. Właśnie zapomniałem dodać kod do mojego pytania. var name: String? – fuiiii

+0

Drugie pytanie jest teraz tutaj http://stackoverflow.com/questions/24844495/swfit-strange-behavior-about-unwrapping – fuiiii