Перечисление Generic Swift 4 с типом Void

Я нашел элегантную работу для меня, чтобы удалить символы и продолжать держать строку в виде строки следующим образом:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

Важно заметить, что использование опции ignore опасно, поскольку она беззвучно удаляет любой юникод (и интернационализации) от кода, который его использует, как показано здесь (конвертировать unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
29
задан Martin R 23 August 2017 в 11:42
поделиться

3 ответа

В Swift 3 вы можете опустить соответствующее значение типа Void:

let res: Result<Void> = .success()

В Swift 4 вам нужно передать соответствующее значение типа Void:

let res: Result<Void> = .success(())
// Or just:
let res = Result.success(())
57
ответ дан Martin R 23 August 2017 в 11:42
поделиться

В 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()
28
ответ дан Hamish 23 August 2017 в 11:42
поделиться

Void - это простые typealias для пустого кортежа: (), поэтому вы можете использовать его как любое из следующего:

let res1: Result<Void> = .success(())
let res2 = Result<Void>.success(())
let res3 = Result.success(() as Void)
let res4 = Result.success(())
3
ответ дан KaQu 23 August 2017 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: