有没有一种 Swifty 方法可以使用字符串插值来解包可选值?
Is there a Swifty way to unwrap optionals with string interpolation?
我正在使用从用户那里收集的值构建一个 RESTful API 查询。其中一些值可能未提供,因此我使用可选值。有 Double、Int 和 String 值。我使用的代码看起来很笨重。是否有更简洁的 Swifty 方法来编写此代码块?
'''Swift
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 可选
的感觉
不要通过连接字符串来构建 URL。使用 URLComponents
和 URLQueryItems
的数组。
然后您可以:
- 如果值为 nil,则不向查询项数组添加项
- 使用 nil
value
字符串创建它们并在完成后进行过滤。
- 对每个可选参数使用
flatMap
做一些事情:
parms.startDate.flatMap {
parameters.append(URLQueryItem(name: "startttime", value: "\([=10=])"))
}
在 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"
我正在使用从用户那里收集的值构建一个 RESTful API 查询。其中一些值可能未提供,因此我使用可选值。有 Double、Int 和 String 值。我使用的代码看起来很笨重。是否有更简洁的 Swifty 方法来编写此代码块?
'''Swift
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 可选
的感觉不要通过连接字符串来构建 URL。使用 URLComponents
和 URLQueryItems
的数组。
然后您可以:
- 如果值为 nil,则不向查询项数组添加项
- 使用 nil
value
字符串创建它们并在完成后进行过滤。 - 对每个可选参数使用
flatMap
做一些事情:
parms.startDate.flatMap {
parameters.append(URLQueryItem(name: "startttime", value: "\([=10=])"))
}
在 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"