在Swift应用程序中解包一个Optional值时出乎意料地发现了nil [重复]

问题描述 投票:-2回答:3

我正在用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'

我该如何更改我的代码?

ios swift
3个回答
1
投票

像这样更新您的代码

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
    }

If-Let语句检查UrlCoreDataController.shared.loadUrl()是否返回nil然后它不会在花括号内执行代码而你的应用程序将不会崩溃。


0
投票

无法在NSManagedObject类'Url'上调用指定的初始值设定项

这意味着类Url没有指定初始化程序。在简单的世界中,你需要在init()类中创建一个Url

例如。

class Url: NSObject {

    //variables

   //initializer
   init() {
   }
}

有关Initializer的信息,请参阅this

loadUrl()方法可以返回nil值。

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

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.")
}

0
投票

处理选项的可能方法很少:

如果让

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

2.guard:

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
}

我主要使用第一种选择。

© www.soinside.com 2019 - 2024. All rights reserved.