Skip to content

Latest commit

ย 

History

History
ย 
ย 

iOS

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

iOS ์ฝ”๋”ฉ ์Šคํƒ€์ผ

Swift ์ฝ”๋”ฉ ์Šคํƒ€์ผ

Apple's Swift API Design Guidelines์™€ Ray Wenderlich Swift Style Guide๋ฅผ ๋”ฐ๋ฅด๋˜ ๋‹ค์Œ์„ ์˜ˆ์™ธ๋กœ ํ•œ๋‹ค.

  • ๋‹จ์ˆœํžˆ 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 ํ•ญ๋ชฉ๋“ค ์ฐธ๊ณ .

Assets Catalog ๋„ค์ด๋ฐ

  • Asset ๋ช…์—๋Š” UpperCamelCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Asset์˜ ํŒŒ์ผ๋ช…์€ ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ์•„๋ž˜์˜ ๋ฆฌ๋”” ๋ฆฌ์†Œ์Šค ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฆฌ๋”” ๋ฆฌ์†Œ์Šค ๋„ค์ด๋ฐ

  • ์†Œ๋ฌธ์ž๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ณต๋ฐฑ์€ ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
  • ์ ‘๋‘์–ด์—๋Š” ํด๋”๋ช…, ์ปดํฌ๋„ŒํŠธ๋ช…, ๋””์ž์ธ ๊ณ ์œ ๋ช…์ด ์žˆ๋‹ค.
  • ๊ฐ ์ ‘๋‘์–ด๋Š” ์–ธ๋”์Šค์ฝ”์–ด๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ 'ํด๋”๋ช…', '์ปดํฌ๋„ŒํŠธ๋ช…', '๋””์ž์ธ ๊ณ ์œ ๋ช…' ์ˆœ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํด๋”๋ช…์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์†ํ•˜๋Š” ๋ทฐ๋‚˜ ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.
    • 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 // ์ƒ๋žตํ–ˆ์„ ๋•Œ๋Š” ๋ชจ๋“  ๋””๋ฒ„์ด์Šค์—์„œ ์‚ฌ์šฉํ•จ์„ ์˜๋ฏธ
  • ์˜ˆ์‹œ๋“ค
    • reader_paper_bg@2x.png
    • memo_bg_2-Landscape@2x.png
    • memo_bg_2-Landscape-667h@2x.png
    • shelf_new_tag~ipad.png