Эти рекомендации я использую в своей повседневной работе, надеюсь, они помогут.
❌ не рекомендую ✅ рекомендую
Определение блока
❌
func doSome(result: (Bool) -> ()) {}
✅
typealias BoolBlock = (Bool) -> ()
/// ....
func doSome(result: BoolBlock) {}
Параметры функции по умолчанию
func logSome(_ msg: String, detail: String = "default detail") {}
logSome("this is msg")
Используйте «guard let» для оценки
❌
func doSome(info: Info) {
if let name = info.name {
doOther(name: name)
}
}
✅
func doSome(info: Info) {
guard let name = info.name else {
return
}
doOther(name: name)
}
Опустите self или init
❌
public override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .blue
let testView = UIView.init()
self.view.addSubview(testView)
}
✅
public override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
let testView = UIView()
view.addSubview(testView)
}
Используйте «для определения метода или атрибута
✅
enum Style {
case cancel
case `default`
}
class LogProvider {
static let `default` = LogProvider()
}
Используйте ?? для возврата к значению по умолчанию
✅
func doSome(info: Info) {
let name = info.name ?? "default name"
}
Тернарный (условный) оператор
❌
var text: String?
if isMe {
text = "Me"
}
else {
text = "other"
}
✅
let text = isMe ? "Me" : "other"
Тип omitted
❌ view.backgroundColor = UIColor.blue ✅ view.backgroundColor = .blue
Используйте расширение для классификации
❌
class LoginVC: UIViewController, UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate {
}
✅
class LoginVC: UIViewController {
/// …
}
extension LoginVC: UITextFieldDelegate {
/// …
}
extension LoginVC: UITableViewDataSource, UITableViewDelegate {
/// …
}
Force Unwrapping и Force Casts
❌
let name = info.name!
✅
guard let name = info.name else {
print("name is nil")
return
}
Типы с сокращенными именами
❌ var items = Array<String>() var map = Dictionary<String, String>() func doSome() -> Void let callback: () -> Void ✅ var items = [String]() var map = [String : String]() func doSome() let callback: () -> ()
Избегайте значений Sentinel
❌
func doSome() -> Int {}
let index = doSome()
if index == -1 {
/// fail
}
else {
/// success
}
✅
func doSome() -> Int? {}
guard let index = doSome() else {
print("fail")
return
}
/// success

















