Есть ли в Swifty способ развернуть дополнительные функции с помощью интерполяции строк? - PullRequest
2 голосов
/ 31 мая 2019

Я создаю запрос 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 = величина & minmagnitude = 5 & limit = 2000 '' '

но у меня такое чувство, что я пропускаю точку Swift Optionals

Ответы [ 2 ]

5 голосов
/ 31 мая 2019

Не создавайте URL путем объединения строк. Используйте URLComponents и массив URLQueryItems.

Вы можете затем:

  • не добавлять элементы в массив элементов запроса, если значение равно nil
  • создайте их с nil value строками и отфильтруйте, когда вы закончите.
  • сделать что-то с flatMap для каждого необязательного параметра:
parms.startDate.flatMap { 
   parameters.append(URLQueryItem(name: "startttime", value: "\($0)"))
}
1 голос
/ 31 мая 2019

В Swift 5 вы можете расширить String.StringInterpolation и написать собственные интерполяции. Подробнее

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...