Я нашел элегантную работу для меня, чтобы удалить символы и продолжать держать строку в виде строки следующим образом:
yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')
Важно заметить, что использование опции ignore опасно, поскольку она беззвучно удаляет любой юникод (и интернационализации) от кода, который его использует, как показано здесь (конвертировать unicode):
>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
В Swift 3 вы можете опустить соответствующее значение типа Void
:
let res: Result<Void> = .success()
В Swift 4 вам нужно передать соответствующее значение типа Void
:
let res: Result<Void> = .success(())
// Or just:
let res = Result.success(())
В Swift 4 регистр enum с ассоциированным значением Void
больше не эквивалентен регистру enum с пустым списком ассоциированных значений.
Я полагаю, что это, как говорит Мартин , результат SE-0029 , где вы больше не можете передавать кортеж аргументов в функцию и заставлять их «разбрызгиваться» параметры (хотя предложение было помечено как реализованное в Swift 3, я считаю, что этот конкретный случай был раскрыт позже при реализации SE-0110 для Swift 4).
В результате это означает, что вы больше не можете называть (Void) -> T
как () -> T
в Swift 4. Теперь вам нужно явно передать Void
:
let result = Result.success(())
Однако, я мне это кажется довольно уродливым, поэтому я обычно реализую расширение вроде этого:
extension Result where T == Void {
static var success: Result {
return .success(())
}
}
, которое позволяет вам говорить такие вещи:
var result = Result.success
result = .success
Стоит отметить, что этот обходной путь не ограничено перечислимыми случаями, это может также использоваться с методами вообще. Например:
struct Foo<T> {
func bar(_ a: T) {}
}
extension Foo where T == Void {
func bar() { bar(()) }
}
let f = Foo<Void>()
// without extension:
f.bar(())
// with extension:
f.bar()
Void - это простые typealias для пустого кортежа: (), поэтому вы можете использовать его как любое из следующего:
let res1: Result<Void> = .success(())
let res2 = Result<Void>.success(())
let res3 = Result.success(() as Void)
let res4 = Result.success(())