Skip to content
Branch: master
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
.swift-version
.swiftformat
.swiftformat-version
.swiftlint-version
.swiftlint.yml
README.md

README.md

iOS μ½”λ”© μŠ€νƒ€μΌ

Swift μ½”λ”© μŠ€νƒ€μΌ

Apple's Swift API Design Guidelines와 Ray Wenderlich Swift Style Guideλ₯Ό λ”°λ₯΄λ˜ λ‹€μŒμ„ μ˜ˆμ™Έλ‘œ ν•œλ‹€.

  • ν‘œν˜„μ‹ λ‚΄μ—μ„œ Boolean을 λΆ€μ •ν•  λ•ŒλŠ” ! λŒ€μ‹  not()을 μ‚¬μš©ν•œλ‹€.

    • Swift 정식 문법은 μ•„λ‹ˆκ³  μ•„λž˜ Extension을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.
      extension Bool {
          func not() -> Bool {
              return !self
          }
      }
  • λ‹¨μˆœνžˆ Boolean 값을 λ³€κ²½ν•  λ•ŒλŠ” toggle()을 μ‚¬μš©ν•œλ‹€.

  • if, guard 문에 콀마(,)λ₯Ό μ΄μš©ν•΄ 쑰건을 μΆ”κ°€ν•  경우 콀마 λ’€μ—μ„œ λ‹€μŒ μ€„λ‘œ λ„˜μ–΄κ°„λ‹€.

// Bad
if results.isEmpty.not(), let delegate = seriesDelegate(byId: seriesId) {
    books.append(delegate)
}
// Good
if results.isEmpty.not(),
    let delegate = seriesDelegate(byId: seriesId) {
        books.append(delegate)
}
  • if, guard 문에 연속적인 let, varλ₯Ό μ„ μ–Έν•  λ•Œ let, varλ₯Ό μƒλž΅ν•˜μ§€ μ•Šλ„λ‘ ν•œλ‹€.
// Bad
if let userInfo = notification.userInfo,
    bookId = userInfo["bookId"] as? String {
        removeObject(forKey: bookId)
}
// Good
if let userInfo = notification.userInfo,
    let bookId = userInfo["bookId"] as? String {
        removeObject(forKey: bookId)
}
  • if, guard λ¬Έμ—μ„œ &&λŠ” 콀마둜 λŒ€μ²΄ν•œλ‹€.
// Bad
if book.isGrouped && book.seriesId != nil {
    ...
}
// Good
if book.isGrouped,
    book.seriesId != nil {
        ...
}
  • 싱글톀은 static let을 μ΄μš©ν•œλ‹€.

  • NS 접두가 뢙은 클래슀의 μ‚¬μš©μ€ μ΅œλŒ€ν•œ μ§€μ–‘ν•œλ‹€.

  • Swiftκ°€ ObjC둜 λ³€ν™˜λ˜λ©΄μ„œ 두 μ–Έμ–΄κ°„ 넀이밍 κ·œμΉ™μ΄ μΆ©λŒν•  경우 Swift 넀이밍 κ·œμΉ™μ„ μš°μ„ μ‹œ ν•œλ‹€.

// Swiftμ—μ„œ ꢌμž₯ν•˜λŠ” 넀이밍
func removeUserShelf(at index: UInt)
// μœ„ λ©”μ†Œλ“œκ°€ xcbuild에 μ˜ν•΄ ObjC둜 λ³€ν™˜λμ„ λ•Œμ˜ 넀이밍
- (void)removeUserShelfAt:(NSUInteger)index;
// ObjCμ—μ„œ ꢌμž₯ν•˜λŠ” 넀이밍
- (void)removeUserShelfAtIndex:(NSUInteger)index;

Objective-C μ½”λ”© μŠ€νƒ€μΌ

Apple's Cocoa Coding Guidlines와 Google Objective-C Style Guideλ₯Ό λ”°λ₯΄λ˜ λ‹€μŒμ„ μ˜ˆμ™Έλ‘œ ν•œλ‹€.

  • 맀크둜 μƒμˆ˜ μ•žμ— kλ₯Ό 뢙이지 μ•Šκ³  λŒ€λ¬Έμžμ™€ μ–Έλ”μŠ€μ½”μ–΄(_)둜 이루어진 이름을 μ‚¬μš©ν•œλ‹€.

  • Modern Objective-C Syntaxλ₯Ό μ‚¬μš©ν•œλ‹€. (주의 : nil이 있으면 error)

NSArray *array = [[NSArray alloc] initWithObjects:@"value1", @"value2", nil];
NSArray *modernArray = @[@"value1", @"value2"];
  
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSDictionary *modernDictionary = @{@"key1": @"value1", "key2": @"value2", ...};
  
NSNumber *number = [[NSNumber alloc] initWith...];
NSNumber *modernNumber = @5; // @.5, @1.5, @YES, @(4 + 2)

곡톡 μ½”λ”© μŠ€νƒ€μΌ

  • Tab SizeλŠ” 4둜 ν•˜κ³  Spaceλ₯Ό μ‚¬μš©ν•œλ‹€.

  • Brace λ‚΄ μ½”λ“œκ°€ ν•œ 쀄이더라도 Brace둜 λ°˜λ“œμ‹œ κ°μ‹ΈλŠ” κ²ƒμœΌλ‘œ ν•œλ‹€.

if (condition) {
    doSomething();
}
  • μ†ŒμŠ€μ½”λ“œ 상단에 μ €μž‘κΆŒ 및 μ €μžλ₯Ό ν‘œμ‹œν•˜λŠ” 주석은 남기지 μ•ŠλŠ”λ‹€.

넀이밍

Swift 넀이밍

Swift API Design Guidelines의 Naming 참고.

Objective-C 넀이밍

Apple's Cocoa Coding Guidlines의 Naming ν•­λͺ©λ“€ μ°Έκ³ .

리디 λ¦¬μ†ŒμŠ€ 넀이밍

  • μ†Œλ¬Έμžλ§Œ μ‚¬μš©ν•œλ‹€.
  • 곡백은 μ–Έλ”μŠ€μ½”μ–΄(_)둜 λŒ€μ²΄ν•œλ‹€.
  • μ ‘λ‘μ–΄μ—λŠ” 폴더λͺ…, μ»΄ν¬λ„ŒνŠΈλͺ…, λ””μžμΈ 고유λͺ…이 μžˆλ‹€.
  • 각 μ ‘λ‘μ–΄λŠ” μ–Έλ”μŠ€μ½”μ–΄λ‘œ κ΅¬λΆ„λœλ‹€.
  • μ—¬λŸ¬ 접두어λ₯Ό μ‚¬μš©ν•  경우 '폴더λͺ…', 'μ»΄ν¬λ„ŒνŠΈλͺ…', 'λ””μžμΈ 고유λͺ…' 순으둜 μ‚¬μš©ν•œλ‹€.
  • 폴더λͺ…은 λ¦¬μ†ŒμŠ€κ°€ μ†ν•˜λŠ” λ·°λ‚˜ κΈ°λŠ₯을 μ˜λ―Έν•œλ‹€.
    • share : λ©‹μ§€κ²Œ κ³΅μœ ν•˜κΈ° λ¦¬μ†ŒμŠ€
    • welcome : μ›”μ»΄λ·° λ¦¬μ†ŒμŠ€
    • reader : λ·°μ–΄ λ¦¬μ†ŒμŠ€
  • 폴더λͺ…은 μƒμœ„ 폴더λͺ…κΉŒμ§€ ν¬ν•¨ν•œλ‹€.
    • X) resources/reader/typo/*.png -> typo_xxx.png
    • O) resources/reader/typo/*.png -> reader_typo_xxx.png
    • O) resources/main/*.png -> main_xxx.png
    • O) resources/*.png -> xxx.png
  • 폴더λͺ…이 μ—†λŠ” κ²½μš°λŠ” 곡용 λ¦¬μ†ŒμŠ€λ₯Ό μ˜λ―Έν•œλ‹€.
  • 폴더λͺ…은 μ–Έλ”μŠ€μ½”μ–΄ 없이 λΆ™μ—¬ μ“΄λ‹€.
  • μ»΄ν¬λ„ŒνŠΈλͺ…은 HIGμ—μ„œ μ–ΈκΈ‰ν•˜λŠ” UI Controls, UI Barsλ₯Ό 짧게 ν‘œν˜„ν•œ 것이닀.
    • navbar
    • tabbar
    • toolbar
    • searchbar
    • bar
    • control
    • btn
    • switch
    • stepper
    • slider
    • spinner
  • μ»΄ν¬λ„ŒνŠΈλͺ…도 μ–Έλ”μŠ€μ½”μ–΄ 없이 λΆ™μ—¬ μ“΄λ‹€.
  • λ””μžμΈ 고유λͺ…은 μ•„μ΄μ½˜μ΄λ‚˜ λ‘œκ³ μ™€ 같이 λ””μžμΈμ—μ„œ ν†΅μƒμ μœΌλ‘œ μ“°μ΄λŠ” 고유λͺ…사이닀.
    • icon
    • logo
    • bg
  • μ ‘λ―Έμ–΄μ—λŠ” μƒ‰μƒμ΄λ‚˜ 크기, μœ„μΉ˜, 순번, ν…Œλ§ˆ, μƒνƒœκ°€ μžˆλ‹€.
    • 색상 : reader_color_black.png
    • 크기 : welcome_logo_large.png
    • μœ„μΉ˜ : selection_arrow_left.png
    • 순번 : customfont_tutorial_1.png
    • ν…Œλ§ˆ : icon_pagination_left_d.png
    • μƒνƒœ : icon_freebook_on.png
  • μ ‘λ―Έμ–΄λŠ” 쀑첩할 수 있으며 μˆœμ„œλŠ” μž¬λŸ‰μ΄λ‹€.
  • ν…Œλ§ˆ μ ‘λ―Έμ–΄μ—λŠ” 'd'와 μƒλž΅μ΄ μžˆλ‹€.
    • d : 닀크 ν…Œλ§ˆ
    • μƒλž΅ : ν™”μ΄νŠΈ ν…Œλ§ˆ
  • μƒνƒœ μ ‘λ―Έμ–΄μ—λŠ” λ˜λ„λ‘ λ‹€μŒ ν•­λͺ©λ§Œ μ‚¬μš©ν•œλ‹€.
    • normal
    • highlighted
      • X) pressed
    • selected
      • X) checked
    • disabled
    • on
    • off
  • μœ„ ν•­λͺ©κ³Ό μœ μ‚¬ν•œ μ˜λ―Έκ°€ μ•„λ‹ˆλΌλ©΄ μƒνƒœ μ ‘λ―Έμ–΄λ‘œ μ“Έ 수 μžˆλ‹€.
    • bookmarked
    • closed
  • μ˜ˆμ‹œλ“€
    • main_searchbar_icon_clear_d.png
    • main_tabbar_icon_settings.png
    • main_library_btn_recent_list.png
    • main_library_icon_download.png
    • main_cloud_navbar_search.png
    • reader_typo_btn_color_darkgray_selected.png
    • reader_typo_stepper_plus.png
    • reader_slider_thumb.png
    • reader_bar_listen_label.png
    • reader_rating_divider.png
    • reader_tts_icon_arrow_up.png
    • reader_shadow.png
    • share_bg_10.jpg
    • share_btn_sns_insta.png
    • shortcut_icon_recent_book.png
    • webview_bar_icon_refresh.png
    • welcome_btn_login_highlighted.png
    • welcome_logo_large.png

μ• ν”Œ λ¦¬μ†ŒμŠ€ 넀이밍

  • 접미어에 orientaion, screenHeight, rate, interfaceIdiom이 μžˆλ‹€.
  • 각 μ ‘λ―Έμ–΄λŠ” 상황에 맞좰 μ„ νƒμ μœΌλ‘œ 쓰이며 μ“Έ λ•ŒλŠ” μ•Œλ§žλŠ” 접두어λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    • -[orientaion]
    • -[screenHeight]
    • @[rate]
    • ~[interfaceIdiom]
  • μ ‘λ―Έμ–΄λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μˆœμ„œλŒ€λ‘œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.
    • X) name-[rate]-[orientaion]
    • X) name-[interfaceIdiom]-[rate]
    • O) name-[screenHeight]-[rate]
  • orientaion은 νŠΉμ • νšŒμ „ μƒνƒœμ—λ§Œ 쓰일 수 μžˆλ„λ‘ ν•˜λŠ” μ ‘λ―Έμ–΄λ‹€.
    • name-Portrait.png // μ„Έλ‘œ λͺ¨λ“œμ—μ„œλ§Œ μ‚¬μš©
    • name-Landscape.png // κ°€λ‘œ λͺ¨λ“œμ—μ„œλ§Œ μ‚¬μš©
    • name.png // μƒλž΅ν–ˆμ„ λ•ŒλŠ” λͺ¨λ“  νšŒμ „ μƒνƒœμ—μ„œ μ‚¬μš©ν•¨μ„ 의미
  • screenHeightλŠ” 아이폰 크기가 νŒŒνŽΈν™”λ˜λ©΄μ„œ 생긴 κ²ƒμœΌλ‘œ νŠΉμ • ν¬κΈ°μ—λ§Œ 쓰일 수 μžˆλ„λ‘ ν•˜λŠ” μ ‘λ―Έμ–΄λ‹€.
    • name-568h.png // 3.5~4.0μΈμΉ˜μ—μ„œλ§Œ μ‚¬μš©
    • name-667h.png // 4.7μΈμΉ˜μ—μ„œλ§Œ μ‚¬μš©
    • name-736h.png // 5.5μΈμΉ˜μ—μ„œλ§Œ μ‚¬μš©
    • name.png // μƒλž΅ν–ˆμ„ λ•ŒλŠ” λͺ¨λ“  ν¬κΈ°μ—μ„œ μ‚¬μš©ν•¨μ„ 의미
  • rateλŠ” νŠΉμ • ν™”λ©΄ λ°°μœ¨μ—μ„œ 쓰일 수 μžˆλ„λ‘ ν•˜λŠ” μ ‘λ―Έμ–΄λ‹€.
    • name@3x.png // 3xμ—μ„œ μ‚¬μš©
    • name@2x.png // 2xμ—μ„œ μ‚¬μš©
    • name.png // μƒλž΅ν–ˆμ„ λ•ŒλŠ” 1xμ—μ„œ μ‚¬μš©ν•¨μ„ 의미
  • interfaceIdiom은 νŠΉμ • λ””λ°”μ΄μŠ€(iPhone/iPod, iPad)μ—μ„œλ§Œ 쓰일 수 μžˆλ„λ‘ ν•˜λŠ” μ ‘λ―Έμ–΄λ‹€.
    • name~ipad.png // iPadμ—μ„œλ§Œ μ‚¬μš©
    • name~iphone.png // iPhone/iPodμ—μ„œλ§Œ μ‚¬μš©
    • name.png // μƒλž΅ν–ˆμ„ λ•ŒλŠ” λͺ¨λ“  λ””λ²„μ΄μŠ€μ—μ„œ μ‚¬μš©ν•¨μ„ 의미
  • μ˜ˆμ‹œλ“€
You can’t perform that action at this time.