Это хороший пост, посвященный частям быстрых хороших функций, таких как расширение, значение параметра по умолчанию, закрытие и т. Д. Но есть несколько мест с небольшими проблемами, вот моя версия.
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 - это очень весело, наслаждайтесь.