2016-03-15 4 views
1

В процессе получения смайликов флага страны, использующих код страны ISO, я вышел с этим закрытием. Любые предложения, чтобы сделать его более компактным с анонимным закрытием?Compact SWIFT Сокращение закрытия

let base : UInt32 = 127397 
    let country = "CH" 
    let countryFlag = country.unicodeScalars.reduce("") { (var flag, code) in 
    flag.append((UnicodeScalar(base + code.value))) 
    return flag 
} 

ответ

1

Я отправляю вам короткий ответ, я приведу объяснение детали вскоре после:

let countryFlag = country.unicodeScalars.reduce("") { $0 + "\(UnicodeScalar(base + $1.value))" } 

И теперь объяснение. Таким образом, во-первых, вы можете пропустить строку с добавляющим и непосредственно вернуть его в одном предложении:

let countryFlag = country.unicodeScalars.reduce("") { (var flag, code) in 
    return flag + "\(UnicodeScalar(base + code.value))" 
} 

После этого вы можете пропустить объявляя flag и code переменные, как они могут быть выведены в виде $0 и $1:

let countryFlag = country.unicodeScalars.reduce("") { 
    return $0 + "\(UnicodeScalar(base + $1.value))" 
} 

И, наконец, если ваше закрытие состоит из одного оператора возврата, вы можете опустить return ключевое слово. Я предпочитаю перемещать их по одной линии для лучшей читаемости:

let countryFlag = country.unicodeScalars.reduce("") { $0 + "\(UnicodeScalar(base + $1.value))" } 
+0

Я ценю ваше время, я застрял, пытаясь применить приложение на $ 0. Спасибо –

+0

'append' ничего не возвращает (объявлено' void') - вместо этого он изменяет объект. Вот почему вы не можете использовать его внутри оператора return. Использование двоичного оператора '+' однако возвращает результат операции (без изменения объектов), и поэтому все в порядке. Если вы нашли мой ответ полезным, вы могли бы считать его принятым. Счастливый стремительный;) –

Смежные вопросы