Swift 프로그래밍 스타일 가이드(raywenderlich.com)

77683 단어
공식raywenderlich.com Swift 프로그래밍 스타일 가이드
본문의 판권은raywenderlich에 귀속된다.com 、The Official raywenderlich.com Swift Style Guide 프로젝트 및 모든 기여자 소유번역자 번역은 지식 전파에만 사용된다.
이 스타일 가이드의 목표는 Swift 코드를 더욱 간결하고 읽기 쉽게 만드는 것입니다.

언어


애플 API 문서 스타일과 통일된 영어를 추천합니다.
권장 사항:
var color = "red"

권장하지 않음:
var colour = "red" 

공백


2개의 공백 문자를 축진으로 사용하고 Tab 탭 문자를 사용하지 마십시오. Xcode에서 반드시 설정하십시오.
방법 정의 시 대괄호나 기타 대괄호(if/else/switch/while 등)의 왼쪽 괄호는 현재 문장의 끝에 쓰이고 오른쪽 괄호는 다른 줄을 써야 한다.
권장 사항:
if user.isHappy {
  //Do something
} else {
  //Do something else
}
if user.isHappy
{
    //Do something
}
else {
    //Do something else
}

방법 정의 사이에 코드를 시각적으로 더욱 뚜렷하고 관리하기 편리하도록 빈 줄을 삽입해야 한다.방법 내부에도 서로 다른 기능의 코드 블록을 구분하기 위해 빈 줄을 사용해야 하지만, 만약 한 방법에 너무 많은 코드 블록이 있다면, 그것들을 여러 방법 (재구성) 으로 나누는 것이 가장 좋다.

메모


필요할 때만 어떤 코드가 왜 그랬는지 설명하기 위해 주석을 쓴다.주석은 코드와 함께 업데이트해야 하며, 삭제할 때 삭제해야 한다.
가능한 한 여러 줄의 주석을 사용하는 것을 피하고 코드 자체가 자신의 기능을 설명하도록 한다.

명명


묘사할 수 있는 낙타봉식 명명법을 사용하여 클래스, 함수, 방법, 변수 등을 명명한다.모듈의 클래스 이름과 상수 이름의 알파벳은 대문자를 필요로 하고, 방법명과 변수 이름의 알파벳은 소문자를 필요로 한다.
권장 사항:
let MaximumWidgetCount = 100

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

권장하지 않음:
let MAX_WIDGET_COUNT = 100

class app_widgetContainer {
  var wBut: UIButton
  let wHeightPct = 0.85
}

함수와 구조기(init)에 대해서는 일목요연하지 않으면 매개 변수에 이름을 붙이는 것을 권장합니다.함수의 가독성을 높일 수 있다면, 매개 변수의 외부 매개 변수 이름을 제공하십시오.
func dateFromString(dateString: NSString) -> NSDate
func convertPointAt(#column: Int, #row: Int) -> CGPoint
func timedAction(#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 Guideline {
  func combineWithString(incoming: String, options: Dictionary?) { ... }
  func upvoteBy(amount: Int) { ... }
}

강좌, 책 및 주석 등의 비코드 텍스트에서 함수를 참조하는 경우 함수의 모든 매개변수에 대한 외부 매개변수 이름을 제공합니다.
The dateFromString() function is great.
Call convertPointAt(column:, row:) from your init() method.
The return value of timedAction(delay:, perform:) may be nil.
Guideline objects only have two methods: combineWithString(options:) and upvoteBy()
You shouldn't call the data source method tableView(cellForRowAtIndexPath:) directly.

클래스 접두사


Swift의 모듈module에는 이름 공간이 포함되어 있으며 모듈에 정의된 모든 유형 이름이 다른 모듈과 충돌하지 않습니다.그래서 우리는 더 이상 이름 충돌을 줄이기 위해 접두사 이름을 사용할 필요가 없다.만약 서로 다른 모듈에서 온 두 개의 같은 이름이 동시에 인용되어야 한다면, 모듈 이름 + 점 + 유형 이름으로 처리할 수 있습니다.
import MyModule

var myClass = MyModule.MyClass()

다시 한 번 말씀드리지만, Swift 형식의 이름을 붙일 때 접두사를 붙이지 마십시오.
Objective-C에 Swift 형식을 노출할 필요가 있으면 Objective-C 에 사용할 적당한 접두사를 지정할 수 있습니다. (ObjC 프로그래밍 스타일 가이드 참조:
@objc (RWTChicken) class Chicken {
   ...
}

분점


Swift는 각 문 뒤에 세미콜론을 붙일 필요가 없습니다.그러나 여러 개의 문장을 한 줄 코드에 쓰면 분호를 붙여야 한다.그러나 우리는 여러 줄의 문장을 한 줄에 쓰는 것을 추천하지 않는다.유일한 예외는 for-conditional-increment 구조로 분호를 사용해야 한다.그러나 당신은 가능한 한 for-in 구조를 사용하여 이런 행위를 대체해야 한다. 추천:
var swift = "not a scripting language"

권장하지 않음:
var swift = "not a scripting language";

주의: Swift는 자바스크립트와 큰 차이가 있습니다. 자바스크립트에서 번호를 무시하면 코드가 안전하지 않다고 여겨집니다.

클래스 및 구조체


클래스 및 구조체의 코드를 다음 순서로 구성하십시오.
변수 및 상수 속성구조기공통 방법사유 방법
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 = x
    self.y = 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 (\(x),\(y)) with an area of \(computeArea())"
  }

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

위의 예에서는 다음 스타일도 보여 줍니다.
속성, 변수, 상수, 매개변수 및 기타 문을 정의할 때 앞에 넣지 않고 뒤에 공백을 넣습니다.예를 들어 x: IntCircle: Shape;
속성의getter,setter 및 속성관찰기willSetdidSet의 실현은 모두 축소되어야 한다.
만약 여러 변수와 구조체가 같은 사용 목적이나 사용 환경을 가지고 있다면, 그것들을 같은 줄 코드에 정의할 수 있다.

Self 사용


Swift에서 self 사용하지 마십시오. 대상의 속성에 접근하거나 호출하는 방법이 필요하지 않기 때문입니다.
유일하게 사용해야 할 장면은 클래스나 구조체의 구조기에서 나온다.self 를 사용하여 들어오는 매개 변수와 클래스/구조체의 속성을 구분할 수 있습니다.
class BoardLocation {
  let row: Int, column: Int

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

함수 정의


가능한 한 짧은 함수 이름을 한 줄에 정의하고 왼쪽 괄호로 끝냅니다.
func reticulateSplines(spline: Double[]) -> Bool {
  // reticulate code goes here
}

함수 이름이 긴 경우 적절한 경우 행을 변경하고 다음 줄의 함수 이름을 들여씁니다.
func reticulateSplines(spline: Double[], adjustmentFactor: Double,
    translateConstant: Int, comment: String) -> Bool {
  // reticulate code goes here
}

가방을 닫다


가능한 한 self(마지막 패키지 파라미터를 방법에 직접 부착한 후 제어 문장의 바디처럼 보임) 패키지 문법을 사용하십시오.패킷의 각 매개 변수에 대해 언제든지 설명 이름을 지정하십시오.
return SKAction.customActionWithDuration(effect.duration) { node, elapsedTime in 
  // more code goes here
}

필자: @aemaeth에서 패키지 파라미터를 다른 줄로 쓰는 방법을 제시했는데 저는 더욱 합리적이고 여러 개의 패키지 파라미터가 너무 긴 문제를 해결했다고 생각합니다.
한 줄 표현식 클로즈업의 경우 장면이 명확하면 암시적 반환을 사용할 수 있습니다.
attendeeList.sort { a, b in
  a > b
}

타입


가능한 한 Swift에서 제공하는 기본 유형을 사용하십시오.Swift도 원생 유형의 대상인 브리지 의 대상을 연결하는 방법을 제공하기 때문에 필요할 때 이 브리지 대상이 제공하는 방법을 마음대로 사용할 수 있다.
권장 사항:
let width = 120.0                                           //Double
let widthString = width.bridgeToObjectiveC().stringValue    //String

권장하지 않음:
let width: NSNumber = 120.0                                 //NSNumber
let widthString: NSString = width.stringValue               //NSString
Objective-C 코드에서 Sprite Kit를 많이 사용하면 코드가 더욱 간결하고 매우 많은 유형 전환을 피할 수 있습니다.

상수


상수 사용CGFloat 키워드 정의, 변수 사용let 키워드 정의.
만약 값이 상수라면, var 키워드를 사용하여 정확하게 정의해야 한다.결국 당신은 let의 사용 빈도가 let보다 훨씬 높다는 것을 알게 될 것이다.
팁: 처음에는 모든 값을 상수로 정의한 다음 컴파일러가 잘못 보고하면 적절한 조정을 할 수 있습니다.

선택 사항

var 값을 수락할 수 있으면 변수나 함수 반환 값의 유형을 선택 가능한 유형으로 정의합니다(가nil.
실례 변수가 사용되기 전에 초기화되는 것을 명확히 알면, 예를 들어 보기 컨트롤러의 하위 보기 ? 가 사용되기 전에 subviews 에서 초기화된다는 것을 알면, 이 변수를 은식 해석 형식 (사용 viewDidLoad 으로 정의할 수 있다.
옵션 값에 액세스할 때 한 번만 액세스하거나 여러 가지 방법으로 액세스할 수 있는 경우 옵션 체인을 사용합니다.
myOptional?.anotherOne?.optionalView?.setNeedsDisplay()

옵션 바인딩!을 사용하면 패키지를 한 번만 분리optional binding할 수 있지만 여러 번 수행하는 경우에 적합합니다.
if let view = self.optionalView {
  // do many things with view
}

유형 추정


Swift 컴파일러는 변수와 상수의 유형을 추정할 수 있습니다.상수나 변수마다 표시되는 형식을 제공할 수 있지만, 대부분의 경우 그럴 필요가 없다.
우리는 컴파일러가 상수나 변수의 유형을 자동으로 추정할 수 있도록 유형 추정을 많이 사용하는 것을 권장합니다. 그러면 코드가 더욱 치밀해질 것입니다.
권장 사항:
let message = "Click the button"
var currentBounds = computeViewBounds()

권장하지 않음:
let message: String = "Click the button"
var currentBounds: CGRect = computeViewBounds()

주의: 이 규칙을 따르면 이름을 지을 때 묘사적인 이름을 더 신중하게 선택해야 한다는 것을 의미합니다.

프로세스 제어


전통적인 unwrap 스타일이 아닌 for-in 순환을 많이 사용하는 것을 권장합니다.
권장 사항:
for _ in 0..5 {
  println("Hello five times")
}

for person in attendeeList {
  // do something
}

권장하지 않음:
for var i = 0; i < 5; i++ {
  println("Hello five times")
}

for var i = 0; i < attendeeList.count; i++ {
  let person = attendeeList[i]
  // do something
}

웃는 얼굴


웃는 얼굴은 raywenderlich.com 사이트에서 매우 두드러진 특성이다.프로그래밍을 할 때의 큰 즐거움과 흥분을 정확하게 표현하는 것이 중요하다.우리는 예술 문자 중 가장 큰 미소를 대표하기 때문에 오른쪽 괄호for를 사용한다.오른쪽 괄호for-condition-increment를 사용하는 웃는 얼굴은 성의가 없어 보이기 때문에 추천하지 않습니다.
권장 사항:
:]

권장하지 않음:
:)

좋은 웹페이지 즐겨찾기