Swift-style-guide: рдЖрд▓рд╕реА рдЖрд░рдВрднрд┐рдХ рдкреИрдЯрд░реНрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдкреНрд░реИрд▓ 2015  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: raywenderlich/swift-style-guide

рд╣рдо рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрди рджрд┐рдиреЛрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

lazy var locationManager: CLLocationManager = {
    let manager = CLLocationManager()
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    return manager
  }()

рдореИрдВрдиреЗ рдЗрд╕реЗ UILabels рдФрд░ рдРрд╕реЗ рднреА рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрд╛ рд╣реИред рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдПрдХ рдЖрд╕рд╛рди рдЬрдЧрд╣ рдкрд░ рд░рдЦрдиреЗ рдХрд╛ рдпрд╣ рдлрд╛рдпрджрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рдореЗрдВ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдлрд╡рд╛рдИрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдЬреЛ рдЧреНрд░реЙрдл рдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ @noescape рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

https://twitter.com/jckarter/status/704100315587477504

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рднреАрддрд░ рд╕реНрд╡рдпрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдЪрд░)

рд╕рднреА 29 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдХреНрдпрд╛ рд╕реНрд╡рдпрдВ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ [unowned self] рдпрд╛ [weak self] рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рдкреНрд░рд╢реНрди рднреА рд╣реИ:
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдордЬрдмреВрдд рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╛рдо рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ рдЧрд╛рдЗрдб рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ:

if let strongSelf = self {

}

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡рдпрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рднреА locationManager рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрднреА рднреА locationManager рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдмрдВрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рдкрдХрдбрд╝ рдХрд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдкред :-)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмрд╕ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдмрдВрдж рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ locationManager рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдХреНрд▓реЛрдЬрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдпрд╣ рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реИрд╕реЗ, ! рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

lazy var locationManager: CLLocationManager = {

рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ ! рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдЕрдкрдиреЗ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рдореЗрдВ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ?

рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдЪреАрдЬрд╝ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЪреАрдЬрд╝ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХрд░реАрдм рд░рдЦрддрд╛ рд╣реИред рдирддреАрдЬрддрди, viewDidLoad() рдЫреЛрдЯрд╛ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рднреА рдкрд╕рдВрдж рд╣реИред рдореИрдВ

рдпрджрд┐ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рддреЛ [unowned self] рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ:

lazy var locationManager: CLLocationManager = {
  [unowned self] in
  let manager = CLLocationManager()
  manager.delegate = self
  ...
  return manager
}()

рдореБрдЭреЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреБрдЫ рд╣рдж рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реВрдХреНрд╖реНрдо рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдЬреИрд╕реЗ рдордЬрдмреВрдд рдмрдирд╛рдП рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛)?

(рд╕рдВрджрд░реНрдн: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID57)

рдЖрдИрдПрдордУ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрдЯрд░реНрди рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯ-рдкреИрдЯрд░реНрди рд░реЗрдкреЛ рдореЗрдВ рд╣реИред рдЪрдХреНрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА CLLocationManager рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдЯрдл рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдердб рдореЗрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреИрдЯрд░реНрди рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕рдВрдкрддреНрддрд┐ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, CLLocationManager рдХреЗ рднреАрддрд░) рдХреЛ рдХрдордЬреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдирд╣реАрдВ?

рдореЗрд░реА рдЧрд▓рддреА рдлрд┐рд░ рд╕реЗ рдордЬрдмреВрдд рдЪрдХреНрд░ рдмрдирд╛рдП рд░рдЦрддреА рд╣реИред рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрдВрдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ [unowned self] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдВрдж рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЧреБрдгреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХрд┐ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдпрд╣ рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ред рдпрджрд┐ var рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ http://mikebuss.com/2014/06/22/lazy-initialization-swift/ рд╕реЗ рджреЗрдЦреЗрдВ

class Person {
    var name: String

    lazy var personalizedGreeting: String = {
        [unowned self] in
        return "Hello, \(self.name)!"
        }()

    init(name: String) {
        self.name = name
    }
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ:

let p = Person(name: "sam")
p.personalizedGreeting
// => "Hello, sam!"

p.name = "definitely somebody else"
p.personalizedGreeting
// => "Hello, sam!"

рдЗрд╕ рд╕рд╛рд░реА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди рд╣реИ, рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдордЭреЗрдВ рддрд╛рдХрд┐ рдпреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЬрдЯрд┐рд▓ рдЧрд▓рддрд┐рдпрд╛рдБ рди рд╣реЛрдВред

/ рдореИрдВ рдЕрдм рдЪреБрдк рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛

Apple рдбреЙрдХреНрд╕ рдореЗрдВ рдЬреЛ @sammyd рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ, Apple рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИ:

lazy var asHTML: () -> String = {
    [unowned self] in
    if let text = self.text {
        return "<\(self.name)>\(text)</\(self.name)>"
    } else {
        return "<\(self.name) />"
    }
}

рджреВрд╕рд░реЗ рд▓рд┐рдВрдХ рдореЗрдВ @sammyd рджреЗрддрд╛ рд╣реИ (рд╡рд╣ рд▓рд┐рдВрдХ рдЖрдЬ рдЦреБрд╢ рд╣реИ:]), рд▓реЗрдЦрдХ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИ:

lazy var personalizedGreeting: String = {
        [unowned self] in
        return "Hello, \(self.name)!"
        }()

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ unowned self рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА ... рдпрд╛рдиреА, рдЖрд▓рд╕реА рдЧреБрдг рдмрдирд╛рдиреЗ рдореЗрдВ ... рдореИрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ (рдЬреИрд╕рд╛ рдХрд┐ @sammyd рдлрд┐рд░ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ рдмреНрд▓реЙрдХ, рд╢рд╛рдпрдж рдЕрдиреНрдп?) _not_ unowned рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЖрд▓рд╕реА рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ unowned рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?

рднрд▓реЗ рд╣реА, рдореИрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред :+1:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ asHTML рдЪрд░ _stores_ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрдВрджред рд╣рдо рдпрд╣рд╛рдВ рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░реЗрдЧреБрд▓рд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ lazy рдФрд░ рдЧреИрд░- lazy рджреЛрдиреЛрдВ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред _рд╣рдореЗрд╢рд╛_ рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ? рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдкрд░рд┐рдХрд▓рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдпрд╛ рд░рдВрдЧ рдереЗ, рддреЛ рдореИрдВ "рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ" рдХрд╛ рд▓рд╛рдн рднреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП viewDidLoad() рдореЗрдВ рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛-рджрд░-рдорд╛рдорд▓рд╛ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВрдиреЗ uilabels/textviews/рдХреЗ рд╕рдмрд╡реНрдпреВ рдХреЗ рд╕рд╛рде рд╡рд░реНрд╖реЛрдВ рд╕реЗ ui рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП initWithFrame рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЙрд▓ рдХреЛ рджреЗрдЦрдиреЗ рдкрд░ рдЯреНрд░рд┐рдкрд┐рдВрдЧ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ - рдЦрд╛рд╕рдХрд░ рд╕реБрдкрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордпред
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ? рд╢рд╛рдпрджред рдХреНрдпрд╛ рдпрд╣ uikit рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдирд┐рдм рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рддрд╛ рд╣реИ? рд╣рд╛рдВред рдХреНрдпрд╛ рдореИрдВ рдирд┐рдм рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдореЗрдВ рдШрдВрдЯреЛрдВ рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ? рдирд╣реАрдВред рдХреНрдпрд╛ рдореЗрд░реЗ рдРрдкреНрд╕ рд╕рдордп рдкрд░ рд╢рд┐рдк рд╣реЛрддреЗ рд╣реИрдВ? рд╣рд╛рдВред рдХреНрдпрд╛ рдореИрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдБ? рдирд╣реАрдВред рдХреНрдпрд╛ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░ рд╣реИрд░рд╛рди рд╣реИрдВ? рд╢рд╛рдпрджред рдХреНрдпрд╛ рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рд╣реИ - рдирд╣реАрдВред
рд╕рд░рд▓ рдХреЛрдб = рд╕рд░рд▓ рддрд░реНрдХ - рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиред

рдХреБрдЫ рд▓реЛрдЧ рддрд░реНрдХ рджреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рд╕реНрдореГрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрдм рддрдХ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) - рдлрд┐рд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рди рдХрд░реЗрдВ (viewDidLoad / loadView рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ)ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рдЖрд▓рд╕реА рдпреБрджреНрдзреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рдереЗред
рддреЛ рдпрд╣ рдкреВрд░реНрд╡-рдЦрд╛рд▓реА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдЖрд▓рд╕реА рд╡рд░ рд▓реЙрдЧрд┐рдирд╡реАрд╕реА = {рд╡рд╛рдкрд╕реА рд▓реЙрдЧрд┐рдирд╡реАрд╕реА ()} ()

рдиреЛрдЯ - рдореИрдВрдиреЗ рдпрд╣рд╛рдВ init рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рд╣реИ - (рдХреЛрдИ xib рдлрд╛рдЗрд▓ рдирд╣реАрдВ)

required public init() {
    super.init(nibName: nil, bundle: nil)
}

рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ
http://stackoverflow.com/questions/27585409/use-a-programmatically-created-uitableviewcell-subclass-in-swift/31801507#31801507

рдЗрд╕

рдХреНрд▓рд╛рд╕ рдЗрд╡реЗрдВрдЯрд╕реЗрд▓: UITableViewCell {

var eventName: UILabel = UILabel()
var eventCity: UILabel = UILabel()
var eventTime: UILabel = UILabel()

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.contentView.addSubview(eventName)
    self.contentView.addSubview(eventCity)
    self.contentView.addSubview(eventTime)
}

override func layoutSubviews() {
    super.layoutSubviews()

    eventName = UILabel(frame: CGRectMake(20, 10, self.bounds.size.width - 40, 25))
    eventCity = UILabel(frame: CGRectMake(0, 0, 0, 0))
    eventTime = UILabel(frame: CGRectMake(0, 0, 0, 0))

}

}

рдмрдирд╛рдо

class EventCell: UITableViewCell {
   lazy public  var lblName = {
    return UILabel (frame: CGRectMake(10, 0, self.bounds.size.width , 40))
  }()

  lazy public  var lblCity = {
   return UILabel (frame: CGRectMake(10, 40, self.bounds.size.width , 20))
  }()
 lazy public  var lblTime = {
      return UILabel (frame: CGRectMake(self.bounds.size.width - 80, 10, , 25))
   }()


   override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
   super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.contentView.addSubview(lblName)
    self.contentView.addSubview(lblCity)
    self.contentView.addSubview(lblTime)
 }

}  

рд▓рдЧрднрдЧ [unowned self] рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдЪрдХреНрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

Apple рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдКрдкрд░ @sammyd рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирдореВрдирд╛ рдХреЛрдб рдЕрдм [unowned self] рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

lazy var asHTML: Void -> String = {
    if let text = self.text {
        return "<\(self.name)>\(text)</\(self.name)>"
    } else {
        return "<\(self.name) />"
    }
}

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдПрдХ рдирдЧреНрди self рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрднреА рднреА рдПрдХ deinit рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдЕрдм рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрди рдХреНрд▓реЛрдЬрд░ рдореЗрдВ self рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ unowned рдпрд╛ unowned(unsafe) рд╣реИ рдпрд╛ рдирд╣реАрдВред рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИред

asHTML рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрд▓реНрдпреВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣рд╛ рд╣реИред asHTML рдорд╛рдорд▓реЗ рдореЗрдВ, [рдЕрдЬреНрдЮрд╛рдд рд╕реНрд╡рдпрдВ] рдЕрднреА рднреА рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдЪрдХреНрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реНрд╡рд┐рдлреНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдпрд╣ рд╕рдм рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрд░рд┐рдХ рдЪреЗрдореНрдмрд░рд▓реЗрди, рд▓реАрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ - рдЖрдИрдУрдПрд╕
рдЖрд░реНрдХрдЯрдЪ - рдРрдк рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕реНрдЯреВрдбрд┐рдпреЛ

рдПрд░рд┐рдХ рдЪреЗрдВрдмрд░рд▓реЗрди @arctouch.com mailto:[email protected]
+1-415-944-2000

рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░реАрдп рдмреНрд░рд╛рдВрдбреЛрдВ рдФрд░ рдлреЙрд░реНрдЪреНрдпреВрди 500 . рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдРрдкреНрд╕
arctouch.com/work | рдЖрд░реНрдХрдЯрдЪ.рдХреЙрдо/рдмреНрд▓реЙрдЧ

8 рджрд┐рд╕рдВрдмрд░ 2015 рдХреЛ рд╕реБрдмрд╣ 8:18 рдмрдЬреЗ, рдЧреНрд╡реЗрдиреНрдбрд▓ рд░реВрдП рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

[рдЕрдЬреНрдЮрд╛рдд рд╕реНрд╡] рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрдХреНрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдирдореВрдирд╛ рдХреЛрдб https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097 -CH20-ID57 Apple рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ @sammyd рджреНрд╡рд╛рд░рд╛ https://github.com/sammyd рдЕрдм [рдЕрдЬреНрдЮрд╛рдд рд╕реНрд╡рдпрдВ] рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг HTML: рд╢реВрдиреНрдп -> тАЛтАЛрд╕реНрдЯреНрд░рд┐рдВрдЧ = {
рдЕрдЧрд░ рдкрд╛рда рджреЗрдВ = рд╕реНрд╡рдпрдВ рдкрд╛рда {
рд╡рд╛рдкрд╕реА "<(рд╕реНрд╡рдпрдВ рдХрд╛ рдирд╛рдо)> (рдкрд╛рда) (рд╕реНрд╡рдпрдВ рдирд╛рдо)>"
} рдЕрдиреНрдпрдерд╛ {
рд╡рд╛рдкрд╕реА "<(рд╕реНрд╡рдпрдВ рдХрд╛ рдирд╛рдо) />"
}
}
рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдПрдХ рдирдЧреНрди рд╕реНрд╡ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрднреА рднреА рдПрдХ deinit рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдЕрдм рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрди рдмрдВрджреЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдпрд╛ рдЕрдЬреНрдЮрд╛рдд (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд) рд╣реИ рдпрд╛ рдирд╣реАрдВред рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub https://github.com/raywenderlich/swift-style-guide/issues/88#issuecomment -162933300 рдкрд░ рджреЗрдЦреЗрдВред

@ arctouch-ericchamberlain, рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдирдореВрдирд╛ рдХреЛрдб рдЕрдм рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, "рдореИрдВ рдХрднреА рднреА рдПрдХ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбрд┐рдирд┐рдЯ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЬреЛ рдПрдХ рдирдЧреНрди рдЖрддреНрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред"

рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░:

class C {
    lazy var d: String = { "\(self)" }()
    deinit { print("deinit") }
}

C()   // deinit
C().d // deinit

рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ рд░рд┐рдЯреЗрди рд╕рд╛рдЗрдХрд▓ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ [unowned self] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдРрд╕рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐

рдЖрд▓рд╕реА рд╡рд░ рдХреБрдЫ = {..}()

рдХреБрдЫ рднреА рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдЬрдм рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐,

рдЖрд▓рд╕реА рд╡рд░ рдХреБрдЫ = {тАж}

рдЪрд░ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдЪрдХреНрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдирдореВрдирд╛ рдХреЛрдб рдореЗрдВ asHTML рдЪрд░ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рд╕реЗ () рдирд┐рдХрд╛рд▓реЗрдВ, рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рдПрд░рд┐рдХ рдЪреЗрдореНрдмрд░рд▓реЗрди, рд▓реАрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ - рдЖрдИрдУрдПрд╕
рдЖрд░реНрдХрдЯрдЪ - рдРрдк рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕реНрдЯреВрдбрд┐рдпреЛ

рдПрд░рд┐рдХ рдЪреЗрдВрдмрд░рд▓реЗрди @arctouch.com mailto:[email protected]
+1-415-944-2000

рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░реАрдп рдмреНрд░рд╛рдВрдбреЛрдВ рдФрд░ рдлреЙрд░реНрдЪреНрдпреВрди 500 . рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдРрдкреНрд╕
arctouch.com/work | рдЖрд░реНрдХрдЯрдЪ.рдХреЙрдо/рдмреНрд▓реЙрдЧ

9 рджрд┐рд╕рдВрдмрд░ 2015 рдХреЛ рджреЛрдкрд╣рд░ 2:10 рдмрдЬреЗ, рдЧреНрд╡реЗрдиреНрдбрд▓ рд░реВрдП рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@ arctouch-ericchamberlain https://github.com/arctouch-ericchamberlain , рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдирдореВрдирд╛ рдХреЛрдб рдЕрдм рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдПрдХ рдХреНрд▓реЛрдЬрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, "рдореИрдВ рдХрднреА рднреА рдПрдХ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбрд┐рдирд┐рдЯ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЬреЛ рдПрдХ рдирдЧреНрди рдЖрддреНрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред"

рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░:

рдХрдХреНрд╖рд╛ рд╕реА {
рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдбреА: рд╕реНрдЯреНрд░рд┐рдВрдЧ = {"(рд╕реНрд╡рдпрдВ)"}()
рджреАрдирд┐рдЯ {рдкреНрд░рд┐рдВрдЯ ("рдбреАрдирд┐рдЯ")}
}

рд╕реА () // deinit
рд╕реА ()ред рдбреА // deinit
рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ рд░рд┐рдЯреЗрди рд╕рд╛рдЗрдХрд▓ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдореБрдЭреЗ [рдЕрдЬреНрдЮрд╛рдд рд╕реНрд╡] рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub https://github.com/raywenderlich/swift-style-guide/issues/88#issuecomment -163413290 рдкрд░ рджреЗрдЦреЗрдВред

рдореИрдВ рдЖрдкрдХрд╛ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ред

рдЙрди рдЖрд▓рд╕реА рдпреБрджреНрдзреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА [unowned self] рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

lazy var d: String = { "\(self)" }()
lazy var asHTML: Void -> String = { "\(self)" }

рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИ?

рдУрд╣, HTML рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдЪрдХреНрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж @ arctouch-ericchamberlainред рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реБрдИ рд╣реИред

@groue

рдРрдкреНрдкрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ [unowned self] рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, HTMLElement рд╡рд░реНрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, HTMLElement рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЗрд╕рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ asHTML рдорд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдмреАрдЪ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдЪрдХреНрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж рд╡реЗ [unowned self] рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:

рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрджрд░реНрдн рдкрд╣рд▓реЗ рд╕реЗ HTMLElement рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдЪрдХреНрд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреИрдкреНрдЪрд░ рд╡рд┐рдзрд┐ рд╣реИред

рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ:

lazy var asHTML: Void -> String = {
    [unowned self] in
    if let text = self.text {
        return "<\(self.name)>\(text)</\(self.name)>"
    } else {
        return "<\(self.name) />"
    }
}

рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреГрд╖реНрда рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ рдХрд┐ рдХрдм рдЪрдХреНрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП unowned рдпрд╛ weak рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдЬреЙрдиреНрдбрдкреЛрдк

рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрдкреНрдкрд▓ рд╕реЗ рдореИрдВрдиреЗ рдЬреЛ рдирдореВрдиреЗ рджреЗрдЦреЗ рд╣реИрдВ, рд╡реЗ рд╕рд╛рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдмреНрд░реИрдХреЗрдЯ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

class EventCell: UITableViewCell {

    lazy public var lblName = UILabel(frame: CGRectZero)
    lazy public var lblCity = UILabel(frame: CGRect())
    lazy public var lblTime = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

} 

рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ рдХрд┐ lazy рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рднреАрддрд░ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИ, рдЗрд╕реЗ рдирд╛рдорд┐рдд рдЗрдирд┐рдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рдЖрд▓рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рднрд╛рд░реА рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдпреЛрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░рд╕реНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐, рдЙрдХреНрдд рд╡рд░реНрдЧ рдХреЗ рдЖрдкрдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рдмрд╛рдж, рдПрдХ рд░рд┐рд╕рд╛рд╡ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд▓реЛрдЬрд░ рд╕реНрд╡рдпрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ред
рд╣рдореЗрд╢рд╛ рдХрдордЬреЛрд░/рдЕрдЬреНрдЮрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рднрд▓реЗ рд╣реА рдЖрдк 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдВ рдХрд┐ рдмрдВрдж рд╣реЛрдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдЦрд┐рд░рдХрд╛рд░, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ред рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЖрд▓рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, dispatch_once(..) рд╕реЛрдЪреЗрдВред рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд░реЛрд▓ рдХрд░реВрдБрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдореГрддрд┐ рд╕рдВрджрд░реНрдн рдЪреАрдЬрд╝ рдХреЛ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрд▓рд╕реА рдкрд░ рд╢реАрд░реНрд╖ рд╣рд┐рдЯ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рднреА рдЧрд▓рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЙрд╕ рдореИрдХреНрд╕рд┐рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ!) рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рд▓реАрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рд╣реИ: рдмрдВрдж рдХреЛ рдПрдХ рдмрд╛рд░ рдЖрд▓рд╕реА рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрд╡рдпрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдХрднреА рднреА рдмрд░рдХрд░рд╛рд░ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирдореВрдирд╛ рдХреЛрдб рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

class Person {
  init(name: String) {
    self.name = name
    print("\(name) is born.")
  }

  deinit {
    print("\(name) dies.")
  }

  var name: String

  lazy var greeting: String = {
    return "Hello \(self.name)!"
  }()

}

do {
  let t = Person(name: "Ray")
  print(t.greeting)
}

print ("Next")

// Prints: 
// Ray is born.
// Hello Ray!
// Ray dies.
// Next

do {
  let t = Person(name: "Ray")
}

print ("End of the world")

// Prints:
// Ray is born.
// Ray dies.
// End of the world

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдЗрд╕ рдкреВрд░реА рдЖрд▓рд╕реА рдЪреАрдЬрд╝ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ CLLocationManager рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдордзреНрдп-рд╕реЗрдЧ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рдорд╛рдВрдЧрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдкреИрдЯрд░реНрди рдЬреЛ рдереЛрдбрд╝рд╛ рдХрдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╡рд╛рдИ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ:

lazy var locationManager: CLLocationManager = self.makeLocationManager()

private func makeLocationManager() -> CLLocationManager
    let manager = CLLocationManager()
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    return manager
}

рдиреЛрдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:

  • рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред
  • рдХреЛрдИ рдвреЗрд░ рд░рд┐рд╕рд╛рд╡ рдирд╣реАрдВ; рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рди рдХрд╛рд░рдгред рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ? рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!
  • рд╕реНрдерд╛рди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ self рдХреЗ рдЕрдирд╕реБрд▓рдЭреЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЧреБрдкреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИред
  • рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВред

рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдореЗрдВ рдпрд╛ рдмрд┐рдирд╛ рд╢рд░реНрдд viewDidLoad() рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ "рдЖрд▓рд╕реА рд╕рднреА рдЪреАрдЬреЗрдВ" рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LazyBoxes рдЬреИрд╕реЗ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджреНрдпрдкрд┐ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЖрд▓рд╕реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд╢рд╛рдпрдж рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдЖ рд░рд╣рд╛ рд╣реИ:
https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md

рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ:

рдЖрд▓рд╕реА
рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдкрд░ рдорд╣реАрди рдЕрдирд╛рдЬ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

// Mark: - Location services
extension MyViewController {
  lazy var locationManager: CLLocationManager = self.makeLocationManager()

  private func makeLocationManager() -> CLLocationManager
    let manager = CLLocationManager()
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    return manager
  }
  // :
}

рдореБрдЭреЗ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рд╕реНрдЯрд╛рдЗрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рдРрддрд░рд╛рдЬ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдореЗрдВ рдбрд╛рд▓рдХрд░ рдПрдХ рдЖрд╕рд╛рди рдпреВрдирд┐рдЯ/рдпреВрдЖрдИ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рд╡реИрд╕реЗ рд╕реНрдерд╛рди рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдмрдВрдзрдХ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рдирд┐рдзрд┐ = рд╕реНрд╡рдпрдВ

рдЖрдкрдХрд╛ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ?

рдмрд╕ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ (рдирд┐рдпрдВрддреНрд░рдХ рджреЗрдЦреЗрдВ?) рдХреЛ CLLocationManagerDelegate рдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛рдПрдВред

@rayfix рдореИрдВрдиреЗ рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рд╕реБрдкрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЖрдзрд╛рд░ рдкрд░ CLLocationManagerDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ред

рдзрдиреНрдпрд╡рд╛рдж

рдПрдлрд╡рд╛рдИрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдЬреЛ рдЧреНрд░реЙрдл рдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ @noescape рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

https://twitter.com/jckarter/status/704100315587477504

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рднреАрддрд░ рд╕реНрд╡рдпрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдЪрд░)

рдмрд╕ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХреНрд╕рдХреЛрдб 8 рдореЗрдВ рдирдП рдореЗрдореЛрд░реА рдЧреНрд░рд╛рдл рд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдПрдХ рдХреИрдкреНрдЪрд░ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛:

lazy var locationManager: CLLocationManager = {
    [unowned self] in
    var _locationManager = CLLocationManager()
    _locationManager.delegate = self
    _locationManager.desiredAccuracy = Set.shared.trackingAccuracy
    _locationManager.allowsBackgroundLocationUpdates = true
    _locationManager.activityType = .fitness      
    _locationManager.distanceFilter = Double(Set.shared.waypointInterval)
    return _locationManager
}()

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рддрдм рдирд╣реАрдВ рд╣реБрдЖ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред

@rondiel рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ CLLocationManager рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЕрд╕рд╛рдЗрди (iOS 10 SDK) рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
@property(assign, nonatomic, nullable) id<CLLocationManagerDelegate> delegate;

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

icanzilb picture icanzilb  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Lweek picture Lweek  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xezun picture xezun  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gokselkoksal picture gokselkoksal  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ