Это хороший пост, посвященный частям быстрых хороших функций, таких как расширение, значение параметра по умолчанию, закрытие и т. Д. Но есть несколько мест с небольшими проблемами, вот моя версия.

2

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

//short-circuit is old but strong
let ternaryDouble = conditional || conditional2
let ternaryTriple = conditional || conditional2 || conditional3

7

Пример кода 7 нетрудно понять большинству умных программистов, но он не ясен и не легко читается, я думаю, что, возможно, вы злоупотребили `guard`.

//short-circuit is old but strong
return password.count > 8 
    && password.count < 15 
    && checkPasswordCharacters(password)

8

Код не является неправильным, но для того, чтобы использовать расширенный Swift, рекомендуется попытаться использовать функциональное программирование в максимально возможной степени, например forEach, map, compactMap, flatMap и reduce. Я почти не помню, когда использовал `for loop`.

//functional programming first
(0..<5).map { $0 * 2}
       .forEach(aClosure)

9

Пример кода показал свойство enum, которое тесно с ним связано. В этом случае я обычно помещаю его в enum.

enum OS {
 case iOS, android, windows, sailfish, ubuntu
 
 var marketShare: Int {
   let shares: [OS: Int] = [
     .iOS: 30,
     .android: 45,
     .windows: 15,
     .sailfish: 8,
     .ubuntu: 2]
 
   return shares[self] ?? 0
 }
}
let operatingSystem_ = OS.iOS
let marketShare_ = operatingSystem_.marketShare

//another very basic version
enum OSMarketShare: Int {
 case iOS = 30
 case android = 45
 case windows = 15
 case sailfish = 8
 case ubuntu = 2
}
var marketShare_ = OSMarketShare.iOS.rawValue

10

В объявлении закрытия нет необходимости добавлять _ или имя.

//bad
class Model {
 func getData(completion: ((_ name: String) -> Void)) {
 
 }
}
//better
class Model {
 func getData(completion: (String) -> Void) {
 
 }
}
//best in some case
typealias CompletionString = (String) -> Void
class Model {
 func getData(completion: CompletionString) {
 
 }
}

И при использовании замыкания объявлять тип тоже не нужно.

//bad
model.getData { [weak self] (data: String) in
 self?.updateView(data)
}
 
//better
model.getData { [weak self] data in
 self?.updateView(data)
}
//best in some case
model.getData { [weak self] string in
 self?.updateView(string)
}

Swift - это очень весело, наслаждайтесь.