【问题标题】:Is there a Swifty way to unwrap optionals with string interpolation?有没有一种 Swifty 的方法来使用字符串插值来解开选项?
【发布时间】:2019-05-31 23:37:47
【问题描述】:

我正在使用从用户那里收集的值构建一个 RESTful API 查询。其中一些值可能未提供,因此我使用了可选项。有 Double、Int 和 String 值。我使用的代码看起来很笨拙。有没有一种更简洁、更快捷的方式来编写这段代码?

'''斯威夫特

let baseURL = "http......"

// Start with required parms
let format = "?format=\(parms.format)"
let endTime = "&endtime=\(parms.endDate)"

// now for optionals
let startTime = parms.startDate != nil ? "&starttime=\(parms.startDate!)" : ""

// Sorted by
let orderby = parms.orderby != nil ? "&orderby=\(parms.orderby!)" : ""
// parts.limit is Int?
let limit = parms.limit != nil ? "&limit=\(parms.limit!)" : ""

var strURL: String
strURL = "\(baseURL)\(format)\(startTime)\(endTime)\(orderby)\(limit)"

'''

我得到了我需要的结果。例如,如果用户没有提供 StartDate 参数,则不会在查询字符串中引用它。

''' https://.....?format=geojson&endtime=2019-05-31&orderby=magnitude&minmagnitude=5&limit=2000 '''

但我有一种错过 Swift Optionals 要点的感觉

【问题讨论】:

  • 与您的需要无关,但如果带有参数的 URL 是您的最终目标,请使用 URLQueryItems。

标签: swift optional


【解决方案1】:

不要通过连接字符串来构建 URL。使用URLComponents 和URLQueryItems 的数组。

然后您可以:

  • 如果值为 nil,则不向查询项数组中添加项
  • 使用 nil value 字符串创建它们并在完成后过滤。
  • 为每个可选参数使用flatMap:
parms.startDate.flatMap { 
   parameters.append(URLQueryItem(name: "startttime", value: "\($0)"))
}

【讨论】:

  • 感谢您告诉我 URLQueryItems 的存在。显然是为了像我一样构建查询。
【解决方案2】:

在 Swift 5 中,您可以扩展 String.StringInterpolation 并编写自定义插值。 Read More

extension String.StringInterpolation {
    public mutating func appendInterpolation<T>(if value: T?, _ literal: StringLiteralType) {
        if let value = value {
            appendInterpolation(literal+"\(value)")
        }
    }
}

现在代替

let startTime = parms.startDate != nil ? "&starttime=\(parms.startDate!)" : ""

你可以使用

let startTime = "\(if: parms.startDate, "&starttime=")"

用法

var startTime = "\(if: parms.startDate, "&starttime=")"
print(startTime)//""
parms.startDate = "mytime"
startTime = "\(if: parms.startDate, "&starttime=")"
print(startTime)//"""&starttime=mytime"

【讨论】:

  • RajeshKumar,问题是如果parms.startDate 为nil,那么您的方法会将startTime 设置为"&amp;starttime="。我第一次尝试let startTime = "&amp;starttime=\(parms.startDate ?? "")"。和你建议的效果一样。但我需要 startTime 为空。
  • 我没有看到更新。我喜欢你使用了一个新的 Swift 结构。
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2022-10-23
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多