有没有一种快速的方法来用字符串插值来解开可选内容?

时间:2019-05-31 13:48:44

标签: swift optional

我正在使用从用户收集的值来构建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的感觉

2 个答案:

答案 0 :(得分:5)

不要通过串联字符串来构建URL。使用URLComponentsURLQueryItems的数组。

然后您可以:

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

答案 1 :(得分:0)

在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"