Xcode 在非可选的字符串上返回 nil

Posted

技术标签:

【中文标题】Xcode 在非可选的字符串上返回 nil【英文标题】:Xcode returns nil on string that isn't optional 【发布时间】:2020-05-27 23:45:48 【问题描述】:

我有一个接收图像和字符串的函数。当我尝试使用 () 功能将字符串放入更长的字符串时,它告诉我它在展开可选时找到了 nil。例外,它根本不是可选的,它是一个字符串。我可以将值打印出来,并且正确输出。

func UpdateBusiness(logo: UIImage, category: String) 
        guard let bizID = UserDefaults.standard.string(forKey: defaultKeys.businessID) else return
        let thisURL = "http://mywebsite.com/api/v0.1/Business/EditBusinessLogoAndCategory?businessID=\(bizID)&category=\(category)"
        let combinedURL = URL(string: thisURL)!

创建 URL 会使系统崩溃。我可以在调试器中看到 category 的值,而且我在这个字符串中没有任何选项。怎么找零?

【问题讨论】:

你检查过调试器中的bizID 是什么吗? 是的。它也正确进入。当我不在那里添加类别时,thisURL 可以正常工作。 它是否在let 行或其他行上崩溃?我确信代码比您显示的要多,因为显示的代码对thisURL 没有任何作用。我的猜测是您正在尝试从 thisURL 创建一个 URL 并且 that 返回 nil @Paulw11 它在那条线上崩溃了,特别是。如果我把它放在一个保护语句中,它会立即返回。 我们无法告诉您为什么 url 无效,因为我们不知道 bizIDcategory 的实际值,但是强制解开 @987654330 的返回值是不安全的@ 因为如果 URL 格式不正确,它可能会失败 【参考方案1】:

此代码由于强制展开而崩溃。在这种情况下可以推荐使用URLComponents。这比字符串连接更具可读性,对于大量参数字符串连接不是一个好的选择。

var components = URLComponents()
components.scheme = "http"
components.host = "mywebsite.com"
components.path = "/api/v0.1/Business/EditBusinessLogoAndCategory"
components.queryItems = [
    URLQueryItem(name: "businessID", value: bizID),
    URLQueryItem(name: "category", value: category)

]
let url = components.url



enter code here

【讨论】:

以上是关于Xcode 在非可选的字符串上返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

检查 nil 的非可选值

Xcode NSManagedObject 子类在它们被标记为非可选时包含可选

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

Swift之深入解析如何处理非可选的可选项类型

斯威夫特 3;用非可选字符串附加可选字符串

非可选的展开值