본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.
protocol
키워드를 사용한다.protocol 프로토콜 이름 {
프로토콜 정의
}
struct SomeStruct: AProtocol, AnotherProtocol {
//구조체 정의
}
class SomeClass: AProtocol, AnotherProtocol {
//클래스 정의
}
enum SomeEnum: Aprotocol, AnotherProtocol {
//열거형 정의
}
class AnotherClass: SomeClass, AProtocol, AnotherProtocol {
//클래스 정의
}
var
키워드를 사용한 변수 프로퍼티로 정의한다.{ get set }
이라고 명시하며, 읽기 전용 프로퍼티는 프로퍼티의 정의 뒤에 { get }
이라고 명시한다.static
키워드를 사용한다.protocol SomeProtocol {
var settableProperty: String { get set }
var notNeedToBeSettableProperty: String { get }
}
//타입 프로퍼티
protocol AnotherProtocol {
static var someTypeProperty: Int { get set }
static var anotherProperty: Int { get }
}
static
키워드를 명시한다.protocol SomeProtocol {
func someMethod(data: Any, number: Int) -> String
}
mutating
키워드를 명시해야 한다.mutating
키워드를 명시하지 않아도 인스턴스 내부 값을 바꾸는 데 문제가 없다.mutating
키워드를 사용한 메서드 요구가 있다고 하더라도 클래스 구현에서는 mutating
키워드를 써주지 않아도 된다.mutating
메서드는 구현이 불가능하다.protocol Resettable {
mutating func reset()
}
class Person: Resettable {
var name: String?
var age: Int?
func reset() {
selt.name = nil
self.age = nil
}
}
struct Point: Resettable {
var x: Int = 0
var y: Int = 0
mutating func reset() {
self.x = 0
self.y = 0
}
}
enum Direction: Resettable {
case east, west, north, south, unknown
mutating func reset() {
self = Direction.unknown
}
}
required
식별자를 붙인 요구 이니셜라이저로 구현해야 한다.final
클래스라면 required
식별자를 붙여줄 필요가 없다.required
와 override
식별자를 모두 명시하여 구현해주어야 한다.protocol Named {
var name: String { get }
init(name: String)
}
struct Pet: Named {
var name: String
init(name: String) {
self.name = name
}
}
//클래스의 경우 required 식별자 사용
class Person: Named {
var name: String
required init(name: String) {
self.name = name
}
}
//상속 불가능한 클래스의 경우 식별자 필요 없음
final class AnotherPerson: Named {
var name: String
init(name: String) {
self.name = name
}
}
//상속받은 클래스의 이니셜라이저 요구 구현 및 재정의
class School {
var name: String
init(name: String) {
self.name = name
}
}
class MiddleSchool: School, Named {
required override init(name: String) {
super.init(name: name)
}
}
class
키워드를 추가해 프로토콜이 클래스 타입에만 채택될 수 있도록 제한할 수 있다.class
키워드가 위치해야 한다.protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
class SomeClass: ReadWriteSpeakable {
func read() {
print("read")
}
func write() {
print("write")
}
func speak() {
print("speak")
}
}
protocol ClassOnlyProtocol: class, Readable, Writeable {
//클래스 전용 프로토콜
}
class AnotherClass: ClassOnlyProtocol {
func read() {
print("read")
}
func write() {
print("write")
}
}
optional
식별자를 요구사항의 정의 앞에 붙여주면 된다.import Foundation
@objc protocol Moveable {
func walk()
@objc optional func fly()
}
class Tiger: NSObject, Moveable {
func walk() {
print("Tiger walks")
}
}
class Bird: NSObject, Moveable {
func walk() {
print("Bird walks")
}
func fly() {
print("Bird flys")
}
}
let tiger: Tiger = Tiger()
let bird: Bird = Bird()
tiger.walk() //Tiger walks
bird.walk() //Bird walks
bird.fly() //Bird flys