php строка в числа в Swift 4

Я нашел эту функцию PHP для кодирования и декодирования строки в числа.
https://stackoverflow.com/a/8087840/10081776

работает как шарм. и я могу использовать его только в php. но мне нужна эта функция в swift4, но я не могу понять, как это сделать.

Я пытаюсь следующий код, но я не знаю, как завершить.

func toNumbers() -> String{
let str = "abcdefg"let numbers = String(format: "%03d", str)
let output = numbers + ??
return numbers
}



func backToString() -> String{
let numbers = "1234560000"let str = ?
return str
}

спасибо за быструю помощь и хороших выходных.

1

Решение

Ссылочная функция PHP возвращает строку с 3 десятичными цифрами для
каждая единица кода UTF-8 в исходной строке. В Свифте это было бы

func toNumbers(_ s: String) -> String {
return s.utf8.map { String(format: "%03d", $0) }.joined()
}

Обратное преобразование немного сложнее, потому что Swift не имеет
встроенная функция, которая соответствует PHP str_split(),
Мы должны перебрать индексы с шагом 3 и преобразовать
каждый срез до байта:

func backToString(_ n: String) -> String? {
var utf8 = Data()
var from = n.startIndex
while from < n.endIndex {
guard let to = n.index(from, offsetBy: 3, limitedBy: n.endIndex) else { return nil }
guard let u = UInt8(n[from..<to]) else { return nil }
utf8.append(u)
from = to
}
return String(data: utf8, encoding: .utf8)
}

Функция возвращает необязательный потому что преобразование может потерпеть неудачу.

Пример использования:

let s = "Wörks wíth all ストリングズ"let n = toNumbers(s)
print(n) // 087195182114107115032119195173116104032097108108032227130185227131136227131170227131179227130176227130186
if let s2 = backToString(n) {
print(s2) // Wörks wíth all ストリングズ
}

И просто для удовольствия: более компактная версия второй функции:

func backToString(_ n: String) -> String? {
return String(bytes: sequence(state: n.startIndex, next: { (from: inout String.Index) -> UInt8?  in
guard let to = n.index(from, offsetBy: 3, limitedBy: n.endIndex) else { return nil }
defer { from = to }
return UInt8(n[from..<to])
}), encoding: .utf8)
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]