2015-10-06 91 views
-1

它可能是基本的快速排队,但我是新的swift或iOS开发。我收到错误fatal error: unexpectedly found nil while unwrapping an Optional valueNSData:意外地发现零,同时展开一个可选值

对于功能波纹管

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

选配斯威夫特可以在第一混乱,但它有助于记住,他们只是一个枚举,如:

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

如果您确定您的选购有非值,即,它是一个.Some,您可以通过感叹号!运算符来访问此基础值。

总之,力量解包optional!说:“好吧,我确定这个可选包含非值,给我。”

这就是所谓的强力展开。您正在告诉系统访问对应于.Some(T)的值,但您并未检查您的可选项是否为.Some.None。如果你强制解开!和你的可选结果是.None,你会得到运行时错误,你得到unexpectedly found nil while unwrapping an Optional value

作为一个经验法则,你应该总是检查你的optionals之前解开它们。在少数情况下,您应该假设可选非强制展开它。例如,如果您尝试在prepareForSegue中访问它,则即使是IBOutlet也可能是nil。 XCode自动使插座隐含地解开,因为对于您的大多数视图控制器的生命周期,它们不会是。但你仍然必须照顾自己的这些不常见的边缘情况,他们是

您可以检查一个可选的具有非值与

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 

卫队声明都在迅速整齐的功能,因为你可以专注于你想要的条件,而不是你不想要的东西。它还保留处理违反要求的代码,以满足相应的要求。与做相同的事情,如果发言后卫通过使您的意图明确提高可读性。

要了解更多,请参阅swift documentation的基础部分。