2016-01-13 3 views
0

Я пытаюсь научиться быстро, и концепция опций разрушает меня.неожиданно нашел нуль при разворачивании необязательного значения при попытке создать объект с помощью конструктора

У меня есть код ниже и он продолжает сбой при попытке создания объекта события b/c eventDescription находит значение nil. Как я могу пройти мимо этой ошибки и создать объект Event с описанием, которое является либо nil, либо пустой строкой?

EventDao.getUpcoming() { 
       (upcomingEvents, error) -> Void in 

       if(upcomingEvents != nil) { 

        // Loop through all the events 
        for currentEvent in upcomingEvents! { 

print(currentEvent) 

         let name = currentEvent["name"] as! NSString 
         let start = currentEvent["start"] as! NSString 
         let teamId = currentEvent["team_id"] as! Int 
         let eventDescription = currentEvent["description"] as? String 
         let eventId = currentEvent["id"] as! Int 

         // Format date format 
         let dateFormatter = NSDateFormatter() 
         dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
         let date = dateFormatter.dateFromString(start as String) 
         dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle 
         dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle 
         let formattedDate = dateFormatter.stringFromDate(date!) 


         self.getTeamInfo(teamId) { 
          (team, err) -> Void in 

          self.getMyResponseForEvent(eventId) { 
           (response, err) -> Void in 

           print(eventDescription) 

           var event: Event 

           if (response == nil) { 
            event = Event(name: name as String, team: team!, time: formattedDate, description: eventDescription! as! String, myResponse: "No Response") // ERRORS HERE WITH: fatal error: unexpectedly found nil while unwrapping an Optional value 
           } else { 
... 

print(currentEvent выходы:

{ 
    "default_response" =  { 
     id = 1; 
     label = "No Response"; 
    }; 
    description = "<null>"; 
    end = "2016-01-19T19:00:43.000-06:00"; 
    id = 1966; 
    location = Withers; 
    name = "Game 5 VS cat.png"; 
    start = "2016-01-19T18:00:43.000-06:00"; 
    "team_id" = 193; 
    timezone = "America/Chicago"; 
} 

Это мой Event.swift файл:

import Foundation 

class Event { 

    // MARK: Properties 

    var name: String 
    var team: Team 
    var time: String 
    var description: String? 
    var myResponse: String 

    // MARK: Initialization 

    init(name: String, team: Team, time: String, description: String, myResponse: String) { 
     self.name = name 
     self.team = team 
     self.time = time 
     self.description = description 
     self.myResponse = myResponse 
    } 

} 
+0

Не пытайтесь развернуть свои переменные с помощью '!'. Используйте 'if-let' или' guard', чтобы развернуть их. Один из ваших опций - «нуль» где-то, но трудно сказать, где именно, потому что на самом деле есть '!'. –

ответ

1

Попробуйте что-то вроде этого:

if let t = team where response == nil { 
    event = Event(name: name as String, team: t, time: formattedDate, description: eventDescription ?? "", myResponse: "No Response") 
} else... 

Один из ваших был nil опциями , Либо team! был nil, либо eventDescription! был nil. Вы можете использовать оператор «nil coalescing» ??, чтобы попытаться развернуть eventDescription и заменить пустую строку, если она равна nil.

Кстати, вы не должны условно бросить eventDescription к String снова, так как вы уже сделали, что, когда она была создана, в этой строке:

let eventDescription = currentEvent["description"] as? String 

В этот момент, это либо String или это nil. Вам не нужно бросать его снова.

Практически каждый раз, когда вы видите ошибку unexpectedly found nil while unwrapping an Optional value, это потому, что вы являетесь силовым инструментом, который может быть добавлен с помощью !.

+0

Я попробую это. я знаю, что eventDescription имеет значение nil, но я хочу пустое значение при создании объекта Event. – Catfish

+1

Это должно быть 'desription: eventDescription ?? "", а не 'description: eventDescription ??'. Хотя, если вы знаете, что 'eventDescription' является' nil', почему вы его вообще включаете? Почему бы просто не пройти пустую строку? Как в: 'description:" "' –

+0

Я просто знаю для этого случая, когда это ошибка. Иногда это имеет значение. – Catfish

Смежные вопросы

 Смежные вопросы