Swift-style-guide: ๋นˆ ๋ฐฐ์—ด ๋ฐ ์‚ฌ์ „ ์ดˆ๊ธฐํ™”์˜ ๋ถˆ์ผ์น˜

์— ๋งŒ๋“  2017๋…„ 04์›” 07์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: raywenderlich/swift-style-guide

๋‚˜๋Š” ์ง€์นจ์— ๋ช…์‹œ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด์šฉ์— ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/raywenderlich/swift-style-guide#type -annotation-for-empty-arrays-and-dictionaries

๊ฐ€์ด๋“œ๋Š” ๋‹ค์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

// preferred
var names: [String] = []
var lookup: [String: Int] = [:]

๋ณด๋‹ค ์„ ํ˜ธ๋œ๋‹ค

// not preferred
var names = [String]()
var lookup = [String: Int]()

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ€์ด๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ์ถ”๋ก ๋œ ์œ ํ˜•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

// preferred
let message = "Click the button"
let currentBounds = computeViewBounds()

```๋น ๋ฅธ
// ์„ ํ˜ธํ•˜์ง€ ์•Š์Œ
let message: String = "๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”"
currentBounds: CGRect = computeViewBounds()

If we were being consistent, shouldn't we always prefer inferred types over explicit declaration?  I would think this is more consistent
```swift
// should be preferred
var names = [String]();
var lookup = [String: Int]();

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ œ ์ƒ๊ฐ์—๋Š” ์—ฌ๊ธฐ ๊ฐ€์ด๋“œ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—†์„ ๋•Œ๋Š” ๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค.

์ข‹์•„, ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ •๋ง ์Šคํƒ€์ผ์˜ ์„ ํƒ์ด ์•„๋‹Œ๊ฐ€? ์•„๋‹ˆ ์ •๋ง. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

์ด์ œ ์ด 3๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ œ์•ˆ๋œ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

๊ทธ๊ณณ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ณผ๊นŒ์š”? ๋งˆ์ง€๋ง‰ ํ–‰์˜ ๊ฒฝ์šฐ ์ด์ œ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด UIColor๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ์–ธ์ด ์„œ๋กœ ๋œ ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ฐฉ๋ฒ•์€? ๋ฌผ๋ก  ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์—†์• ๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

๋ง์ด ๋ผ?

_ํŽธ์ง‘: ๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ด์™€ ๊ฐ™์€ ๋ฐฐ์—ด์„ ์œ ์ถ”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋ฐฐ์—ด์„ ํ…Œ์ด๋ธ”์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์˜ณ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ._

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

๋ชจ๋“  4 ๋Œ“๊ธ€

์ œ ์ƒ๊ฐ์—๋Š” ์—ฌ๊ธฐ ๊ฐ€์ด๋“œ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—†์„ ๋•Œ๋Š” ๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค.

์ข‹์•„, ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ •๋ง ์Šคํƒ€์ผ์˜ ์„ ํƒ์ด ์•„๋‹Œ๊ฐ€? ์•„๋‹ˆ ์ •๋ง. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

์ด์ œ ์ด 3๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ œ์•ˆ๋œ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

๊ทธ๊ณณ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ณผ๊นŒ์š”? ๋งˆ์ง€๋ง‰ ํ–‰์˜ ๊ฒฝ์šฐ ์ด์ œ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด UIColor๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ์–ธ์ด ์„œ๋กœ ๋œ ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ฐฉ๋ฒ•์€? ๋ฌผ๋ก  ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์—†์• ๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

๋ง์ด ๋ผ?

_ํŽธ์ง‘: ๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ด์™€ ๊ฐ™์€ ๋ฐฐ์—ด์„ ์œ ์ถ”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋ฐฐ์—ด์„ ํ…Œ์ด๋ธ”์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์˜ณ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ._

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

๋‚˜๋Š” ํ•จ๊ป˜ ๊ฐ”์„ ๊ฒƒ์ด๋‹ค

var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red, .green, .blue]

์œ„์—์„œ ํ•œ ๊ฒƒ ๋Œ€์‹ . ๋ช…์‹œ์  ์„ ์–ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์œ ์ถ”๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ์„ธ ๋ฒˆ์งธ ์ค„์€ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋งˆ๋„ ๊ทœ์น™์„ ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ™”ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ์ž˜๋ชป๋œ ๊ฒƒ์€ ์—†์œผ๋ฉฐ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ๋•Œ ์•„๋ž˜๊ฐ€ ๋” ์ผ๊ด€๋˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์‹ค์šฉ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ผ์–ด๋“ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red]
// not preferred (in my opinion)
var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red]

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค.

// inconsistent?
var colors: [UIColor] = []
var colors = rainbowColors()
// your preference
var colors = [UIColor]()
var colors = rainbowColors()

@RobertGummesson , ๋ฐฐ์—ด/์‚ฌ์ „ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์œ ํ˜•๋งŒ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ฑ„์šธ ๋ฐฐ์—ด๋งŒ ์žˆ๋‹ค๋ฉด ๋‘ ์†”๋ฃจ์…˜ ๋ชจ๋‘ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์„ธํŠธ๋ฅผ ์–ป์—ˆ๊ณ  ๊ทธ๊ฒƒ๋“ค๋„ ํฌํ•จํ•˜๋Š” ์ปจ๋ฒค์…˜์—์„œ ํ‘œ์ค€ํ™”ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋ช…์‹œ์ ์ธ ํƒ€์ดํ•‘๋ณด๋‹ค ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

var ints: Set = [1, 1, 2, 2]
var ints = Set([1, 1, 2, 2])
var ints = Set(arrayLiteral: 1, 1, 2, 2)

๋”ฐ๋ผ์„œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์„ธํŠธ์— ๋” ๋‚˜์€ ์ตœ์ƒ์˜ ์„ ํƒ์„ ๊ฒฐ์ •ํ•œ ํ›„ ๋นˆ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐฐ์—ด ๊ทœ์น™์„ ๋ฐฑํฌ๋ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var ints: Set<Int> = []
var ints = Set<Int>() // instead of this, which, without the above, seems fine.

var ints = [1, 1, 2, 2]
var ints: [Int] = []
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰