Code reviewing in iOS app development @Kansai Mobile Conference #2
J04ΞϓϦͷίʔυϨϏϡʔͰ࠷ۙؾʹͳΔͱ͜Ζ@yashiganiؔϞόΠϧΞϓϦݚڀձ#2
View Slide
yashiganiid:yashigani_w @yashiganiMobile Application Engineerhttp://yashigani.hatenablog.comHatena
https://flic.kr/p/b3j2n2ίʔυϨϏϡʔͯ͠·͔͢ʁ
ͳΜ͔ωλ୳ͯͨ͠ΜͰ͚͢Ͳಛʹ͜Εͬͯͷ͕ແͯ͘ɼ͋ΕʁίʔυϨϏϡʔͱ͔ΊͬͪΌҙࣝߴͦ͏Ͱ͍͍Μ͡ΌͶʁ͓ͬͯͬͯ·ͱΊͯΈͨΜͰ͢Αɽͦͨ͠ΒίʔυϨϏϡʔͷ؍ͬͯΑ͘ߟ͑ͨΒΞϓϦέʔγϣϯΛઃܭ͢Δͱ͖ʹؾΛ͚ͭΔ͖ϙΠϯτ·ͱΊΈ͍ͨͳײ͡ͳΜͰ͢ΑɽͳΜͰͦ͏͍͏͜ͱ͢ΜͰ͚͢ͲɼίʔυϨϏϡʔ͓͍ͬͯͯͨ͠΄͏͕ͳΜ͔͋Γ͕ͨΈ͕ߴ͍ΜͰࠓίʔυϨϏϡʔͷͱ͍͏͜ͱʹͳΓ·͢ɽ
TUPSZCPBSEؔ࿈
͜ΕstoryboardͰͰ͖·ͤΜ͔ʁ• ࡉ͔͍viewͷઃఆͰ͖Δ͚ͩstoryboardͰ݁ͤͨ͞΄͏ָ͕• ࢄ͢Δͱ͋ͱͰ͠ʹ͍͘• ϨΠΞτͷίʔυجຊॻ͔ͳ͍• (AutoLayoutͷϨϏϡʔࠜੑͰΔ)
storyboardͰઃఆͰ͖ͳ͍• viewDidLoadͱ͔awakeFromNibͰೖΕΔͷ!• propertyͷdidSetΛͬͨ΄͏͕៉ྷ• Objective-C?ૣ͘غͯͯ͘Ε
class ViewController:UIViewController {@IBOutlet weak var textView:UITextView! {didSet {textView.textContainerInset= UIEdgeInsets(top: 16,left: 16, bottom: 16, right: 16)}}}
IBInspectableΛઃఆ͢Δ• ઃఆ͠ͳ͍ཧ༝ͳ͍• ΠϚΠν͍ʹ͔ͬͨ͘ΧελϜϏϡʔͷ࠶ར༻ੑ͕ΊͬͪΌ্͕Γ·͢
@IBDesignableclass BorderedLabel: UILabel {@IBInspectablevar borderColor: UIColor? {get { return UIColor(CGColor: self.layer.borderColor) }set {self.layer.borderColor = newValue?.CGColor ?? nil}}@IBInspectablevar borderWidth: CGFloat = 1.0 {didSet {layer.borderWidth = borderWidth}}@IBInspectablevar cornerRadius: CGFloat = 0.0 {didSet {layer.cornerRadius = cornerRadiuslayer.masksToBounds = cornerRadius > 0.0}}}
7JFX$POUSPMMFSؔ࿈
͜ͷpropertyݮΒͤ·ͤΜ͔ʁ• stored propertyঢ়ଶͳͷͰͰ͖Δ͚ͩݮΒͨ͠΄͏͕Α͍• computed propertyผ• closureͰΩϟϓνϟ͢Δͱ͔ͰͳΜͱ͔Ͱ͖ͳ͍͔
UITableViewDataSourceׂͰ͖·ͤΜ͔ʁ• UITableViewDataSourceׂ͍͢͠ͷͰૣΊʹׂ͓ͯ͘͠• NSObjectstoryboard͔ΒೖͰ͖Δ
?ΑΓ!• viewDidLoadprepareForSegueͰॳظԽ͢ΔΑ͏ͳpropertyOptionalʹ͕ͪ͠• OptionalΑΓImplicitly Unwrapped Optionalͷ΄͏͕͍͍͢• Ͳ͏ͤແ͍ͱಈ͔ͳ͍Μ͔ͩΒૣ͘Ϋϥογϡͨ͠΄͏͕ಘ
4XJGUؔ࿈
computed property͑·ͤΜ͔ʁ• ఆͦͷΦϒδΣΫτͷঢ়ଶ͔Βࢉग़Ͱ͖ΔΛฦ͢ϝιουcomputed propertyʹ• υϝΠϯΛด͡ࠐΊΒΕΔ• ͋ͱ()͕͍Βͳ͘ͳΔͷͰྑ͍
enum͑·ͤΜ͔ʁ• ϓϦϛςΟϒͳઐ༻ͷΦϒδΣΫτͰঢ়ଶΛ ཧ͍͍ͯ͠ͷখֶੜ·Ͱ• UITableViewͷsectionͱ͔(Raw ValuesΛ͏ͱΑ͍)• enumʹด͡ࠐΊΔ• ྫ͑section headerͷλΠτϧͱ͔• Associated Valuesߟྀ͢Δ
lazyͰOptionalΛ֎͢• ࣗͷproperty Aʹґଘ͢Δproperty Bͷ• B͕ඞཁͳͱ͖ʹAଘࡏ͢Δͱ͖ɼBΛlazyʹ͢Δ͜ͱͰOptionalΛ֎͢͜ͱ͕Ͱ͖Δ
class BookmarkManager {let manager: UserManagerinit(_ manager: UserManager) {self.manager = manager}}class ViewController: UIViewController {var userManager: UserManager!var bookmarkManager: BookmarkManager!override func viewDidLoad() {bookmarkManager =BookmarkManager(userManager)}}
class BookmarkManager {let manager: UserManagerinit(_ manager: UserManager) {self.manager = manager}}class ViewController:UIViewController {var userManager: UserManager!lazy var bookmarkManager:BookmarkManager =BookmarkManager(self.userManager)}
ςετͰ!ΛΘͳ͍• ςετ͕ࣦഊ͢ΔΜ͡Όͳͯ͘མͪΔ• CIͰٽ͘• ࠷ѱͷঢ়ଶ• ͕औಘͰ͖ΔͣͰOptional Chainͱ͔҆શͳखஈΛ͏
let bookmark: Bookmark = ...XCTAssertNotNil(bookmark.title,"...")XCTAssertEqual(bookmark.title!, "ؔϞόΠϧΞϓϦݚڀձ#2", "...")
let bookmark: Bookmark = ...XCTAssertNotNil(bookmark.title,"...")XCTAssertEqual(bookmark.title ??"", "ؔϞόΠϧΞϓϦݚڀձ#2", "...")
·ͱΊ
• storyboard͍ͯ͠΄͍͠• View Controllerͱʹ͔͘ଠΒͳ͍Α͏ʹ͢Δ• Swiftͱʹ͔͘࠷ߴ
͋Γ͕ͱ͏͍͟͝·ͨ͠