Counter
클래스 정의의 예입니다:Counter
클래스는 3개의 인스턴스 메서드를 정의합니다:increment()
는 1
씩 카운터를 증가시킵니다.increment(by: Int)
는 특정 정수 크기만큼 카운터를 증가시킵니다.reset()
은 카운터를 0으로 재설정 합니다.Counter
클래스는 현재 카운터 값을 추적하는 count
프로퍼티 변수도 선언합니다.self
라는 암시적 프로퍼티를 가지고 있습니다. 자체 인스턴스 메서드 내에서 현재 인스턴스를 참조하기 위해 self
프로퍼티를 사용합니다.increment()
메서드는 아래와 같이 작성될 수 있습니다:self
를 꼭 작성할 필요가 없습니다. self
를 명시적으로 작성하지 않으면 Swift는 메서드 내에서 이미 알고 있는 프로퍼티 또는 메서드 이름을 사용할 때마다 현재 인스턴스의 프로퍼티 또는 메서드를 참조한다고 가정합니다. 이 가정은 Counter
에 3개의 인스턴스 메서드 내에서 self.count
가 아닌 count
를 사용하여 입증됩니다.self
프로퍼티를 사용합니다.self
는 x
라는 메서드 파라미터와 x
라고 하는 인스턴스 프로퍼티를 명확하게 합니다:self
접두사가 없으면 Swift는 x
의 2가지 사용이 모두 x
라는 메서드 파라미터를 참조한다고 가정합니다.self
프로퍼티에 새로운 인스턴스를 할당하고 새로운 인스턴스는 메서드가 종료되면 기존에 존재하던 인스턴스를 대체하게 됩니다.func
키워드 전에 mutating
키워드를 위치 시켜 이 동작을 선택할 수 있습니다:Point
구조체는 포함한 양만큼 Point
인스턴스를 이동시키는 변경가능한 moveBy(x:y:)
메서드를 정의합니다. 새로운 위치를 반환하는 대신에 이 메서드는 실제로 호출된 위치를 수정합니다. mutating
키워드는 프로퍼티를 수정할 수 있도록 정의에 추가됩니다.self
프로퍼티를 완전히 새로운 인스턴스로 할당할 수 있습니다. 위에서 본 Point
예제는 대신 다음과 같은 방식으로 작성되었을 수도 있습니다:moveBy(x:y:)
메서드는 x
와 y
값이 대상 위치로 설정된 새로운 구조체를 생성합니다. 이 대체 버전의 메서드를 호출한 최종 결과는 이전 버전의 호출 결과와 동일합니다.self
파라미터를 설정할 수 있습니다:next()
메서드가 호출될 때마다 3개의 전원 상태 (off
, low
, high
)를 순환합니다.func
키워드 전에 static
키워드를 작성하여 타입 메서드를 나타냅니다. 클래스는 대신 class
키워드를 사용하여 하위 클래스가 해당 메서드의 수퍼 클래스 구현을 재정의 할 수 있습니다.NOTE Objective-C에서는 Objective-C 클래스에 대해서만 타입 레벨 메서드 (type-level methods)를 정의할 수 있습니다. Swift에서는 모든 클래스, 구조체, 그리고 열거형에 대해서 타입 레벨 메서드를 정의할 수 있습니다. 각 타입 메서드는 지원하는 타입으로 명시적으로 범위가 지정됩니다.
SomeClass
라는 클래스에서 타입 메서드를 호출하는 방법은 다음과 같습니다:self
프로퍼티는 타입의 인스턴스가 아닌 타입 자체를 참조합니다. 인스턴스 프로퍼티와 인스턴스 메서드 파라미터에서와 같이 self
를 타입 프로퍼티와 타입 메서드 파라미터를 명확하게 하기위해 사용할 수 있다는 의미입니다.LevelTracker
라는 구조체를 정의합니다. 이것은 1인용 게임이지만 단일 디바이스에서 여러명의 플레이어를 위한 정보를 저장할 수 있습니다.LevelTracker
구조체는 게임의 레벨이 풀리는 것을 추적하기 위해 타입 프로퍼티와 메서드를 사용합니다. 각 플레이어의 현재 레벨도 추적합니다.LevelTracker
구조체는 모든 플레이어가 푼 가장 높은 레벨을 추적합니다. 이 값은 highestUnlockedLevel
이라는 타입 프로퍼티에 저장됩니다.LevelTracker
는 highestUnlockedLevel
프로퍼티와 함께 동작하는 2개의 타입 함수도 정의합니다. 첫번째 타입 함수는 unlock(_:)
이라 하며 새로운 레벨이 풀릴 때마다 highestUnlockedLevel
의 값을 업데이트 합니다. 두번째 타입 함수는 isUnlocked(_:)
이라 하며 편의 타입 함수이며 특정 레벨이 이미 풀려있다면 true
를 반환합니다 (이 타입 메서드는 LevelTracker.highestUnlockedLevel
로 작성할 필요없이 highestUnlockedLevel
타입 프로퍼티를 접근할 수 있습니다).LevelTracker
는 게임을 통해 각 플레이어의 진행사항을 추적합니다. 플레이어가 현재 플레이 중인 레벨을 추적하는 currentLevel
이라는 인스턴스 프로퍼티를 사용합니다.currentLevel
프로퍼티 관리를 돕기위해 LevelTracker
는 advance(to:)
라는 인스턴스 메서드를 정의합니다. currentLevel
업데이트 전에 이 메서드는 요청된 새 레벨이 이미 풀렸는지 판단합니다. advance(to:)
메서드는 currentLevel
을 설정가능한지 아닌지를 나타내기 위해 부울값으로 반환합니다. advance(to:)
메서드를 호출하여 반환값을 무시하는 코드가 실수가 아니기 때문에 이 함수는 @discardableResult
속성으로 표시됩니다. 더 자세한 내용은 속성 (Attributes) 을 참고 바랍니다.LevelTracker
구조체는 아래에서 봤듯이 각 플레이어의 진행상태를 추적하고 업데이트 하기 위해 Player
클래스와 함께 사용됩니다:Player
클래스는 플레이어의 진행상태를 추적하기 위해 새로운 LevelTracker
의 인스턴스를 생성합니다. 플레이어가 특정 레벨을 완료했는지 판단하는 complete(level:)
이라는 메서드도 제공합니다. 이 메서드는 모든 플레이어에게 다음 레벨을 풀고 다음 레벨로 이동하기 위해 플레이어의 진행상태를 업데이트 합니다 (이전 라인에서 LevelTracker.unlock(_:)
을 호출하여 해당 레벨을 풀기 때문에 advance(to:)
의 부울 반환 값은 무시됩니다).Player
클래스의 인스턴스를 생성할 수 있고 플레이어가 레벨1을 완료하면 어떤 일이 생기는지 알 수 있습니다: