-
๋ค์ฌ์ฐ๊ธฐ์๋ ํญ(tab) ๋์ 2๊ฐ์ space๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
์ฝ๋ก (
:
)์ ์ธ ๋์๋ ์ฝ๋ก ์ ์ค๋ฅธ์ชฝ์๋ง ๊ณต๋ฐฑ์ ๋ก๋๋ค.let names: String? var day: Date?
-
ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๊ฐ ์ต๋ ๊ธธ์ด๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ์๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฐ๊ฟํฉ๋๋ค.
let actionSheet = UIActionSheet( title: "์ ๋ง ๊ณ์ ์ ์ญ์ ํ์ค ๊ฑด๊ฐ์?", delegate: self, cancelButtonTitle: "์ทจ์", destructiveButtonTitle: "์ญ์ ํด์ฃผ์ธ์" )
๋จ, ํ๋ผ๋ฏธํฐ์ ํด๋ก์ ๊ฐ 2๊ฐ ์ด์ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ๋ด๋ ค์ฐ๊ธฐํฉ๋๋ค.
UIView.animate( withDuration: 0.25, animations: { // doSomething() }, completion: { finished in // doSomething() } )
-
if let
๊ตฌ๋ฌธ์ด ๊ธธ ๊ฒฝ์ฐ์๋ ์ค๋ฐ๊ฟํ๊ณ ํ ์นธ ๋ค์ฌ์๋๋ค.if let user = self.veryLongFunctionNameWhichReturnsOptionalUser(), let name = user.veryLongFunctionNameWhichReturnsOptionalName(), user.gender == .female { // ... }
-
guard let
๊ตฌ๋ฌธ์ด ๊ธธ ๊ฒฝ์ฐ์๋ ์ค๋ฐ๊ฟํ๊ณ ํ ์นธ ๋ค์ฌ์๋๋ค.else
๋guard
์ ๊ฐ์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ์ฉํฉ๋๋ค.guard let user = self.veryLongFunctionNameWhichReturnsOptionalUser(), let name = user.veryLongFunctionNameWhichReturnsOptionalName(), user.gender == .female else { return }
-
๋น ์ค์๋ ๊ณต๋ฐฑ์ด ํฌํจ๋์ง ์๋๋ก ํฉ๋๋ค.
-
๋ชจ๋ ํ์ผ์ ๋น ์ค๋ก ๋๋๋๋ก ํฉ๋๋ค.
-
MARK ๊ตฌ๋ฌธ ์์ ์๋์๋ ๊ณต๋ฐฑ์ด ํ์ํฉ๋๋ค.
// MARK: Layout override func layoutSubviews() { // doSomething() } // MARK: Actions override func menuButtonDidTap() { // doSomething() }
๋ชจ๋ ์ํฌํธ๋ ์ํ๋ฒณ ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๋ด์ฅ ํ๋ ์์ํฌ๋ฅผ ๋จผ์ ์ํฌํธํ๊ณ , ๋น ์ค๋ก ๊ตฌ๋ถํ์ฌ ์๋ํํฐ ํ๋ ์์ํฌ๋ฅผ ์ํฌํธํฉ๋๋ค.
import UIKit
import SwiftyColor
import SwiftyImage
import Then
import URLNavigator
-
ํด๋์ค ์ด๋ฆ์๋ UpperCamelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CamelCase์์, ๋งจ ์๊ธ์๋ฅผ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ ๊ฒ์ ๋ปํฉ๋๋ค. PascalCase๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
๋๋จธ์ง ๋ค์ ๋ฐ๋ผ๋ถ๋ ๋จ์ด๋ค์ ์๊ธ์๋ ๋ชจ๋ ๋๋ฌธ์๋ก ํ๊ธฐํฉ๋๋ค
-
ํด๋์ค ์ด๋ฆ์๋ ์ ๋์ฌ๋ฅผ ๋ถ์ด์ง ์์ต๋๋ค.
-
ํจ์ ์ด๋ฆ์๋ lowerCamelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
ํจ์ ์ด๋ฆ ์์๋ ๋๋๋ก์ด๋ฉด
get
์ ๋ถ์ด์ง ์์ต๋๋ค.์ข์ ์:
func name(for user: User) -> String?
๋์ ์:
func getName(for user: User) -> String?
-
Action ํจ์์ ๋ค์ด๋ฐ์ โ์ฃผ์ด + ๋์ฌ + ๋ชฉ์ ์ดโ ํํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- will์ ํน์ ํ์๊ฐ ์ผ์ด๋๊ธฐ ์ง์ ์ด๊ณ , did๋ ํน์ ํ์๊ฐ ์ผ์ด๋ ์งํ์ ๋๋ค.
- should~๋ ์ผ๋ฐ์ ์ผ๋ก
Bool
์ ๋ฐํํ๋ ํจ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ข์ ์:
func backButtonDidTap() { // back ๋ฒํผ์ ํด๋ฆญ ํ์ ๋ // ... }
- ๋ณ์ ์ด๋ฆ์๋ lowerCamelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
์์ ์ด๋ฆ์๋ lowerCamelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ข์ ์:
let maximumNumberOfLines = 3
๋์ ์:
let kMaximumNumberOfLines = 3 let MAX_LINES = 3
-
enum์ ๊ฐ case์๋ lowerCamelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ข์ ์:
enum Result { case .success case .failure }
๋์ ์:
enum Result { case .Success case .Failure }
-
์ฝ์ด๋ก ์์ํ๋ ๊ฒฝ์ฐ ์๋ฌธ์๋ก ํ๊ธฐํ๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ํญ์ ๋๋ฌธ์๋ก ํ๊ธฐํฉ๋๋ค.
์ข์ ์:
let userID: Int? let html: String? let websiteURL: URL? let urlString: String?
๋์ ์:
let userId: Int? let HTML: String? let websiteUrl: NSURL? let URLString: String?
-
Delegate ๋ฉ์๋๋ ํ๋กํ ์ฝ๋ช ์ผ๋ก ๋ค์์คํ์ด์ค๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
์ข์ ์:
protocol UserCellDelegate { func userCellDidSetProfileImage(_ cell: UserCell) func userCell(_ cell: UserCell, didTapFollowButtonWith user: User) }
๋์ ์:
protocol UserCellDelegate { func didSetProfileImage() func followPressed(user: User) // `UserCell`์ด๋ผ๋ ํด๋์ค๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ปดํ์ผ ์๋ฌ ๋ฐ์ func UserCell(_ cell: UserCell, didTapFollowButtonWith user: User) }
-
ํด๋์ค์ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์์๋
self
๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. -
๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ ๋์๋ Swift ๊ตฌ์กฐ์ฒด ์์ฑ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ข์ ์:
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
๋์ ์:
let frame = CGRectMake(0, 0, 100, 100)
-
Array<T>
์Dictionary<T: U>
๋ณด๋ค๋[T]
,[T: U]
๋ฅผ ์ฌ์ฉํฉ๋๋ค.์ข์ ์:
var messages: [String]? var names: [Int: String]?
๋์ ์:
var messages: Array<String>? var names: Dictionary<Int, String>?
-
///
๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ํ์ ์ฌ์ฉ๋๋ ์ฃผ์์ ๋จ๊น๋๋ค./// ์ฌ์ฉ์ ํ๋กํ์ ๊ทธ๋ ค์ฃผ๋ ๋ทฐ class ProfileView: UIView { /// ์ฌ์ฉ์ ๋๋ค์์ ๊ทธ๋ ค์ฃผ๋ ๋ผ๋ฒจ var nameLabel: UILabel! }
-
// MARK:
๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถ์ง์ต๋๋ค.Objective-C์์ ์ ๊ณตํ๋
#pragma mark
์ ๊ฐ์ ๊ธฐ๋ฅ์ผ๋ก, ์ฐ๊ด๋ ์ฝ๋์ ๊ทธ๋ ์ง ์์ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ ๋ ์ฌ์ฉํฉ๋๋ค.// MARK: Init override init(frame: CGRect) { // doSomething() } deinit { // doSomething() } // MARK: Layout override func layoutSubviews() { // doSomething() } // MARK: Actions override func menuButtonDidTap() { // doSomething() }
class HomeVC: UIViewController {
// Mark: Variable Part
// ๋ณ์ ์์๋ค์ ์ ์ธํ๊ธฐ
// lowerCamelCase๋ฅผ ์ฌ์ฉํ๋ค
// ex) var userName: String?
// Mark: IBOutlet
// Label,ImageView,Button ๋ฑ @IBOutlet ์ ์ธํ๊ธฐ
// @IBOutlet weak var titleLabel: UILabel!
// Mark: IBAction
// ๋์์ ์ ์ธํ๋ @IBAction ์ ์ธํ๊ธฐ
// ์ฃผ์ด + ๋์ฌ + ๋ชฉ์ ์ด์ ํํ ์ฌ์ฉํ๊ธฐ
// ex) @IBAction func backButtonDidTap(_ sender: Any)
// Mark: Life Cycle Part
// ex) viewWillAppear(), ViewDidLoad()
}
extension HomeVC {
// Mark: Function
// ๋ก์ง์ ๊ตฌํํ๋ ํจ์ ๋ถ๋ถ
// ex)func name(for user: User) -> String?
}
// Mark: Extension
// ํด๋์ค๋ฅผ ํ์ฅํ ๋ ์ฌ์ฉ
// ex) UITableViewDelegate
๋ณธ ๋ฌธ์๋ Swift Style Guide๋ฅผ ์ฐธ๊ณ ํด team meaning์ ๋ง๊ฒ ์์ ํ์์ต๋๋ค. ํฌ๋ฆฌ์์ดํฐ๋ธ ์ปค๋จผ์ฆ ์ ์์ํ์ 4.0 ๊ตญ์ ๋ผ์ด์ผ์ค์ ๋ฐ๋ผ ์ด์ฉํ ์ ์์ผ๋ฉฐ, ์ ์๊ถ์ ์ ์์ด๊ณผ StyleShare์๊ฒ ์์ต๋๋ค.