【问题标题】:Unexpectedly found nil [duplicate]意外发现 nil [重复]
【发布时间】:2015-07-15 13:36:57
【问题描述】:

我正在使用我的应用中的联系人,用户可以选择联系人姓名... 但是如果名字或姓氏为空,我会收到这个常见错误:

致命错误:在展开可选值时意外发现 nil

我知道我的问题可能重复,但我已经阅读了一些文章,但我不知道如何解决我的问题。

这是我的代码:

let firstName: ABMultiValueRef? =
        ABRecordCopyValue(person,
            kABPersonFirstNameProperty).takeRetainedValue() as ABMultiValueRef


        let lastName: ABMultiValueRef? =
        ABRecordCopyValue(person,
            kABPersonLastNameProperty).takeRetainedValue() as ABMultiValueRef

        titleField.text = ("\(firstName) \(lastName)")

我还是想填写文本字段。

编辑:

我从相关问题中找到了这个解决方案:

 var name:String = ""
        if let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String {
            name += first
        }
        if let last  = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String {
            name += last
        }
        titleField.text =  name
}

【问题讨论】:

    标签: xcode swift null optional


    【解决方案1】:

    在周围撒一些? 以说明nil,例如,

    let firstName: ABMultiValueRef? =
            ABRecordCopyValue(person,
                kABPersonFirstNameProperty)?.takeRetainedValue() as? ABMultiValueRef
    

    您还应该为firstName 可能是nil 的可能性做好准备,例如,使用与if let firstName: ABMultiValueRef = … 的可选绑定,并将任何依赖于firstName 的代码放在@ 的then 分支中987654328@。整个事情看起来像:

    if let firstName: ABMultiValueRef = ABRecordCopyValue(person,
            kABPersonFirstNameProperty)?.takeRetainedValue() as? ABMultiValueRef,
           lastName: ABMultiValueRef = ABRecordCopyValue(person,
            kABPersonLastNameProperty)?.takeRetainedValue() as? ABMultiValueRef {
        titleField.text = "\(firstName) \(lastName)"
    } else {
        titleField.text = "" // <- handle the failure case?
    }
    

    【讨论】:

      【解决方案2】:

      试试这个,

      if((let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String) && (let last  = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String)) {
      
          titleField.text = ("\(firstName) \(lastName)")
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多