원문 : https://github.com/raywenderlich/swift-style-guide



reaywenderlich Swift 코딩룰 

Naming

클래스 이름은 대문자로 메소드 이름과 변수는 소문자로 시작하는게 좋다
private let maximumWidgetCount = 100

class WidgetContainer {
  var widgetButton: UIButton
  let widgetHeightPercentage = 0.85
}

함수와 init 메소드들에 대해 context가 매우 분명한 것을 제외한 모든 인자값들에 대한 이름을 선호한다.
func dateFromString(dateString: String-> NSDate
func convertPointAt(column columnInt, row: Int-> CGPoint
func timedAction(afterDelay delay: NSTimeInterval, perform action: SKAction) -> SKAction!

// would be called like this:
dateFromString("2014-03-14")
convertPointAt(column: 42, row: 13)
timedAction(delay: 1.0, perform: someOtherAction)

메소드의 경우, 매소드 이름의 첫번째 매개변수는 애플 표준의 기준을 따른다.
class Counter {
  func combineWith(otherCounter: Counter, options: Dictionary?) { ... }
  func incrementBy(amount: Int) { ... }
}

Enumerations
열거형의 값은 대문자 카멜표기법을 사용한다.
enum Shape {
  case Rectangle
  case Square
  case Triangle
  case Circle
}

Prose
일반적은 경우의 함수에서는 이름없는 매개변수에 대해 ‘_’를 사용한다.
데이터 소스 메소드인 tableView(_:cellForRowAtIndexPath:)를 직접 호출하지 말라

의심이 들면, XCode에서 어떻게 메소드 목록을 보여주는지 보라 



Class Prefixes
Swift 타입은 모듈에 의해 자동으로 네임스페이스에 포함 된다. 클래스 접두어를 추가하지 말라
만약 다른 모듈에서 충돌된다면 모델이름과 타입이름을 이용하여 접두어를 명확히 할수 있다.
import SomeModule

let myClass = MyModule.UsefulClass()

Spacing
줄바꿈을 방지하기 위해 탭과 들여쓰기를 2 space로 설정



if/else/switch/while 등의 {는 항상 같은 라인에서 사용 
if user.isHappy {
  // Do something
else {
  // Do something else
}

메소드들 간에 빈줄을 하나씩 둬야 한다
기능별로 분리

Comments
필요한 경우에 주석을 사용
코드와 같은 줄에는 주석을 사용하지 말라
코드 자체가 주석이 되어야 한다
문서 생성에 사용된 주석은 제외

Class and Structures
구조체는 값 타입
구조체는 식별자(identify)가 아닌 경우에 사용
배열은 구조체

클래스는 레퍼런스 타입
클래스는 식별자(identify)타입, 생명주기를 가진다
때때로 구조체가 될수 있어 AnyObject 또는 예전부터 사용된 (NSDate, NSSet)  클래스들은 확인이 필요하다.   
class Circle: Shape {
  var x: Int, y: Int
  var radius: Double
  var diameter: Double {
    get {
      return radius * 2
    }
    set {
      radius = newValue / 2
    }
  }

  init(x: Int, y: Int, radius: Double) {
    self.= x
    self.= y
    self.radius = radius
  }

  convenience init(x: Int, y: Int, diameter: Double) {
    self.init(x: x, y: y, radius: diameter / 2)
  }

  func describe() -> String {
    return "I am a circle at \(centerString()) with an area of \(computeArea())"
  }

  override func computeArea() -> Double {
    return M_PI * radius * radius
  }

  private func centerString() -> String {
    return "(\(x),\(y))"
  }
}

속성, 변수, 상수, 매개변수 선언에 콜론 뒤에 공백을 둔다 예) x: Int 와 Circle: Shape
여러개의 변수를 정의 할때 공통의 목적와 컨텍스트를 갖는 경우 에는 한줄로 표시한다.
getter와 setter는 들여쓰기를 한다
internal이 기본인 경우 수정하지 않는다. 유사하게 매소드를 재정의 할때 접근법을 수정하지 말라

Use of Self
Swift에서는 간결함을 위해 객체의 속성과 메소드 호출할때 self를 사용하지 않는다
초기화 할때 매개변수 이름과 속성 이름을 구분하는 데 필요할때에 self를 사용
closure 사용할때 
class BoardLocation {
  let row: Int, column: Int

  init(row: Int, column: Int) {
    self.row = row
    self.column = column

    let closure = {
      println(self.row)
    }
  }
}

Protocol Conformance
클래스에서 프로토콜 추가할때, 클래스 확장에 추가하는 것을 선호한다
프로토콜 그룹화하면 프로토콜 추가하는 함수들을 단순화 할수 있다.
class MyViewcontroller: UIViewController {
  // class stuff here
}

// MARK: - UITableViewDataSource
extension MyViewcontroller: UITableViewDataSource {
  // table view data source methods
}

// MARK: - UIScrollViewDelegate
extension MyViewcontroller: UIScrollViewDelegate {
  // scroll view delegate methods
}

Computed Properties
편의상 읽기전용 속성값의 경우 get 절을 생략한다
get 절은 set 절이 제공될때 필요하다
var diameter: Double {
  return radius * 2
}

Function Declarations
짧은 함수 선언은 한줄에 { (brace:중괄호)를 포함한다.
함수가 길면 적절하게 줄바꿈을 하고, 다음줄은 들여쓰기를 한다
func reticulateSplines(spline: [Double], adjustmentFactor: Double,
    translateConstant: Int, comment: String-> Bool {
  // reticulate code goes here
}

Closure Expressions

하나의 클로저 매개변수 목록의 마지막이 하나의 클로져 매개변수인 경우 후행 클로져를 사용한다
클로져 매개변수를 설명하는 이름을 제공
UIView.animateWithDuration(1.0) {
  self.myView.alpha = 0
}

UIView.animateWithDuration(1.0,
  animations: {
    self.myView.alpha = 0
  },
  completion: { finished in
    self.myView.removeFromSuperview()
  }
)

하나의 클로져를 표현할때 암시적인 반환을 사용한다
attendeeList.sort { a, b in
  a > b
}

Type
Swift 기본타입을 사용
필요한 경우에 Objective-C 와 사용할수 있다. 
let width = 120.0                                    // Double
let widthString = (width as NSNumber).stringValue    // String
Sprite Kit 코드의 경우 더 간결하고 많은 변환을 피하기 위해 CGFloat를 사용한다.

Constants
상수는 let, 변수는 var 
항상 값의 변화가 없으면 let사용

Optionals
변수 과 함수 리턴타입 선언할때 ? 을 포함하면 nil 값을 사용할수 있다. 
나중에 사용하기 전에 초기화 되는 것을 알고 있는 값을 암시적으로 언랩핑 선언 할때 !
viewDidLoad 에서 subviews 같이 설정된다

옵셔널 채이닝(optional chaining)을 사용
self.textContainer?.textLabel?.setNeedsDisplay()

옵셔널 바인딩(optional binding)을 사용한다.
if let textContainer = self.textContainer {
  // do many things with textContainer
}

옵셔널 변수와 속성값의 이름을 지을때 이미 선언된 ‘optionalString' 이나 ‘maybeView' 와 같은 이름은 피한다.  
옵셔널 바인딩(optional binding) 할때 원래 이름과 동일한 ‘unrappedView’ ‘actualLabel’과 같이 적절한 이름을 사용한다
var subview: UIView?
var volume: Double?

// later on...
if let subview = subview, volume = volume {
  // do something with unwrapped subview and volume
}

Struct Initializers
CGGeometry 생성자를 사용하기 보다 기본 Swift 구조체 초기화를 사용하는게 더 좋다 
let bounds = CGRect(x: 40, y: 20, width: 120, height: 80)
let centerPoint = CGPoint(x: 96, y: 42)

구조체 범위 상수들을 선호한다. CGRect.infiniteRect, CGRect.nullRect, 그외 글로벌 상수 CGRectInfinite, CGRectNull 
기존에 존재하는 변수는 .zeroRect 처럼 짧게 사용할수 있다.

Type Inference(형식 추론)
CGFloat나 Int16처럼 직접 특정 타입을 지정하는 경우를 제외하면 컴파일러가 변수와 상수의 타입을 추론한다. 
let message = "Click the button"
let currentBounds = computeViewBounds()
var names = [String]()
let maximumWidth: CGFloat = 106.5

Syntactic Sugar
간편한 문법 사용
var deviceModels: [String]
var employees: [IntString]
var faxNumber: Int?

Control Flow
for-조건-증가 문법보다는 for-in 스타일 선호  
for _ in 0..<3 {
  println("Hello three times")
}

for (index, person) in enumerate(attendeeList) {
  println("\(person) is at position #\(index)")
}

Semicolons
Swift는 세미콜론을 필요로 하지 않는다
만약 한 줄에 여러줄을 결합하는 경우에만 사용 가능
한줄에 세미콜론을 사용하여 여러줄을 사용하지 말라
for-조건-증가 문법을 사용하는 것을 제외. 가능한한 for-in 문법 사용
let swift = "not a scripting language"

Language
애플 API와 같은 US English 스팰링을 사용한다.
let color = "red"

Copyright Statement
저작권 설명은 항상 소스파일 맨 위에 포함한다
/*
 * Copyright (c) 2015 Razeware LLC
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

Smiley Face

raywenderlich.com에서는 웃는 표정을 :]으로 사용한다. 


저작자 표시 비영리 변경 금지
신고

'iOS > 참고' 카테고리의 다른 글

[발번] Swift Style Guide (raywenderlich)  (0) 2016.07.12
iOS bundle Seed Id 얻어오기  (0) 2016.07.12
iOS 스와이프로 뒤로 가기 처리  (0) 2016.07.12
iOS 캘린더 사용하기  (0) 2016.07.12
iOS WebView 서버 로그 보려면  (0) 2016.07.12
iOS9 에서 http 사용하기  (0) 2016.03.14
Posted by 까칠코더.


티스토리 툴바