Ios 在Swift应用程序中展开可选值时意外发现nil

Ios 在Swift应用程序中展开可选值时意外发现nil,ios,swift,Ios,Swift,我正在用Swift构建一个应用程序。 我班上有以下代码: var url : Url? = Url() 在ViewDidLoad()方法中,我有以下内容: override func viewDidLoad() { super.viewDidLoad() //recuper ip di arduino url = UrlCoreDataController.shared.loadUrl()! self.setUpLuci()

我正在用Swift构建一个应用程序。 我班上有以下代码:

var url : Url? = Url()
在ViewDidLoad()方法中,我有以下内容:

override func viewDidLoad() {
        super.viewDidLoad()

        //recuper ip di arduino
        url = UrlCoreDataController.shared.loadUrl()!

        self.setUpLuci()
        //    self.tabella.dataSource = self
        //    self.tabella.delegate = self
    }
loadUrl()方法可以返回nil值

因此,如果该方法返回nil值,则我有以下错误:

2018-03-06 12:29:47.150240+0100 ArduinoHomeKit_bis[2318:1060982] [error] error: CoreData: error: Failed to call designated initializer on NSManagedObject class 'Url'
CoreData: error: CoreData: error: Failed to call designated initializer on NSManagedObject class ‘Url'

如何更改代码?

像这样更新代码

override func viewDidLoad() {
        super.viewDidLoad()

        //recuper ip di arduino
        if let _url = UrlCoreDataController.shared.loadUrl() {
               url = _url
               self.setUpLuci()
        }
        //    self.tabella.dataSource = self
        //    self.tabella.delegate = self
    }
若让语句检查
UrlCoreDataController.shared.loadUrl()
是否返回nil,那个么它将不会在花括号内执行代码,你们的应用程序也不会崩溃

未能调用NSManagedObject类“Url”上的指定初始值设定项

这意味着类
Url
没有指定的初始值设定项。 在简单世界中,您需要在
Url
类中创建
init()

例如

class Url: NSObject {

    //variables

   //initializer
   init() {
   }
}
关于初始值设定项,请参阅

loadUrl()方法可以返回nil值

为此,您可以使用guard语句或使用可选Bing

guard let url = UrlCoreDataController.shared.loadUrl() else {
    print("url is not available.")
    return;
}

//here you have url
 print(url)

if let url = UrlCoreDataController.shared.loadUrl() {
    print(url)
} else {
   print("url is not available.")
}

有几种可能的方法来处理选项:

1.如果让

if let url = UrlCoreDataController.shared.loadUrl() {
    url = url
    self.setupLuci()
}
2.2.2:

guard let url = UrlCoreDataController.shared.loadUrl() {
     // do something here if url is nil
     return
}
 // and here if url is not nil
3.if声明

if url != nil {
  // do here Your stuff
}

我主要使用第一个选项。

不需要支持变量,例如
\u url
,您可以在可选的局部范围展开中定义另一个
url
变量,只需执行
url=url
。是的,您需要这样做,因为这是从可选变量展开值的推荐方法。您是get异常,因为您试图从可选变量中获取值,而值为nil。您误解了我的意思。我没有说应该使用可选绑定,我只是说不需要用不同的名称声明临时变量。如果让url=UrlCoreDataController.shared.loadUrl(){url=url;self.setUpLuci()}
,您可以执行
。哈哈哈,是啊,我误解了,因为我以为您创建了一个有目的的变量,这就是我创建新变量的原因。