12 советов, как сделать в Swift меньше кода

1440
12 советов, как сделать в Swift меньше кода
12 советов, как сделать в Swift меньше кода

Эти рекомендации я использую в своей повседневной работе, надеюсь, они помогут.

❌ не рекомендую   ✅ рекомендую

Определение блока

❌
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