2015-10-06 2 views
-1

Это может быть основной быстрый quetion, но я новичок в быстрой разработке или iOS. Я получаю ошибку fatal error: unexpectedly found nil while unwrapping an Optional valueNSData: неожиданно найдено nil во время разворачивания необязательного значения

Для функции пыльник

func Call() -> NSData? 
     {   
      let nilObj: NSData? = nil 
      if(false){ 
        // Doing something  
       } 
      else 
       {   
       return nilObj!   
       } 
     } 

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

+0

просто верните нуль. Это соглашение Swift, чтобы назвать ваши методы строчной первой буквой –

ответ

2

Вы указали nilObj как необязательный и инициализировали его nil. Затем в вашем предложении else вы пытаетесь развернуть это. Для фиксации проблемы нужно просто удалить, что !

Изменить код:

func Call() -> NSData? 
{   
    let nilObj: NSData? = nil 
    if(false) 
    { 
     // Doing something  
    } 
    else 
    {   
     return nilObj  
    } 
} 
0

Ну, ошибка говорит все это! Вы пытаетесь принудительно развернуть дополнительный. Вы должны использовать синтаксис if let во время разворачивания необязательного.

0

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

enum Optional<T> { 
    case None 
    case Some(T) // swift enums can have data associated to them 
} 

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

Короче говоря, принудительное разворачивание optional! говорит: «Хорошо, я уверен, что это необязательно содержит значение nil. Дайте его мне».

Это то, что называется force-unwrapping. Вы сообщаете системе, чтобы получить доступ к значению, соответствующему .Some(T), хотя вы не проверяете, является ли ваш факс .Some или .None. Если вы force-unwrap с !, а ваш дополнительный вариант окажется .None, вы получите сообщение об ошибке unexpectedly found nil while unwrapping an Optional value.

Как правило, вы всегда должны проверять свои варианты, прежде чем разворачивать их. В нескольких случаях вы должны принять опцию: nil и force-unwrap it. Даже IBOutlet может оказаться nil, если вы попытаетесь получить к нему доступ, например, в prepareForSegue. XCode автоматически делает выходы неявно разворачивается, потому что для большей части вашего жизненного цикла контроллера вашего вида не будет nil. Но вам все равно придется позаботиться о себе из этих менее распространенных случаев, в которых они находятся nil.

Вы можете проверить, если опция имеет значение, отличное от ноля стандартного способа с

if optional != nil { 
    // force-unwrapping after nil check is fine 
    optional!.someMethod() 
} else { 
    // 'optional' is nil 
} 

Более идиоматическим способом сделать это с быстрым через опциональное связывание.

// binds the constant 'value' to your optional if it is non-nil 
if let value = optional { 
    value.someMethod() 
} else { 
    // optional is nil 
} 

Третий способ проверить это с сторожевого заявлением. Семантика записей охраны немного отличается от предыдущих. Вы также можете смешать охранные показания и необязательное связывание.

guard optional != nil else { 
    // optional is nil. 
    // by the end of this branch you must exit the block that 
    // encloses the guard statement, such as with a return or break 
    return 
} 
// if control reaches here you're guaranteed optional is non-nil 

заявление Guard является аккуратной особенностью быстрым, потому что вы можете сосредоточиться на условиях, которые вы хотите, а не то, что вы не хотите. Он также сохраняет код, который обрабатывает нарушенное требование рядом с соответствующим требованием. По сравнению с тем же делом с , если оператор, охранники улучшают читаемость, делая ваши намерения ясными.

Чтобы узнать больше, ознакомьтесь с разделом основ swift documentation.

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