Swift 프로그래밍 스타일 가이드(raywenderlich.com)
본문의 판권은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: Int
와Circle: Shape
; 속성의
getter
,setter
및 속성관찰기willSet
와didSet
의 실현은 모두 축소되어야 한다. 만약 여러 변수와 구조체가 같은 사용 목적이나 사용 환경을 가지고 있다면, 그것들을 같은 줄 코드에 정의할 수 있다.
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
를 사용하는 웃는 얼굴은 성의가 없어 보이기 때문에 추천하지 않습니다.권장 사항:
:]
권장하지 않음:
:)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.