【问题标题】:Getting a value of "Optional(<data value>)" even when unwrapping即使在展开时也获得“可选(<数据值>)”的值
【发布时间】:2020-06-27 01:51:18
【问题描述】:

我正在尝试为 Alamofire 请求初始化参数。出于某种原因,其中一个参数的值总是以“Optional()”的值结束,即使我正在展开它。

这是我尝试过的...

var params : [String : Any] = [:]
    
params["facility_id"] = facility.facilityId ?? 0
if facility.email != nil {
    params["email"] = facility.email!
}
if let url = facility.facebookUrl {
    params["facebook_url"] = url
}

params["facebook_url"] 的值最终为 "Optional(Facebook.com)"

我试过了(只是为了测试)

params["facebook_url"] = facility.facebookUrl!

我的值中仍然包含“可选(”)这个词。

如何让“Optional()”消失?

【问题讨论】:

  • 您要访问哪个键?
  • @Jarvis The Avenger,我正在尝试访问facebook_url
  • 对字典的任何访问都将返回一个可选值,因为可能没有键值 try if let url = params["facebook_url"] { print(url) }
  • 我收到Optional(facebook.com)
  • 可能是双重可选的情况。查看我的解决方案。

标签: ios swift xcode optional swift-optionals


【解决方案1】:

当您访问字典时,它会返回其值类型的可选值,因为它不知道运行时某些键是否在字典中可用。如果键存在,则返回其值,如果不存在,则返回 nil 值。

使用可选绑定访问未包装的值:

if let url = params["facebook_url"] {
    print(url) // facebook url
}

如果双重可选展开:

if let urlOptional = params["facebook_url"], let value = urlOptional {
    print(value) // facebook url
}

注意:还要检查您设置“facebook_url”键值的来源。

【讨论】:

  • 但是我将参数发送到一个 web 服务 api,它无法解开它们,“可选”文本最终出现在数据库中。这只发生在那个参数上。所有其他工作正常。 Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default)
  • 结帐双可选展开。
  • 同时调试并检查 URL 是否不包含可选字符串
  • Initializer for conditional binding must have Optional type, not 'Any'
  • 所以这不是双重可选的情况,请检查您的网址是否实际上不是'可选(Facebook.com)'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多