Swift / Welcome to Swift(5)

Minsang Kang·2022년 2월 14일
0

Swift

목록 보기
5/5
post-thumbnail

The Swift Programming Language 도서 내용을 토대로 번역 및 요약된 내용입니다.

A Swift Tour

Objects and Classes

class 클래스명 을 통해 class를 생성할 수 있다.
class의 속성은 var, let을 통해, 함수는 func을 통해 동일하게 생성할 수 있다.

class Shape {
    var numberOfSides = 0 // 속성
    func simpleDescription() -> String { // 함수
        return "A shape with \(numberOfSides) sides."
    }
}

클래스명 뒤에 괄호()를 붙여 instance를 생성할 수 있다.
. 을 통해 class의 속성, 함수를 접근할 수 있다.

var shape = Shape() // instance 생성
shape.numberOfSides = 7 // 속성 접근
var shapeDescription = shape.simpleDescription() // 함수 접근

instance 가 생성될 때 init 을 통해 class를 설정할 할 수 있다.
self 를 통해 속성을 접근할 수 있으며, 모든 속성은 init 에서 함수처럼 받아온 인자를 통해, 혹은 초기값 설정을 통해 초기화가 되어야 한다.

class NamedShape {
    var numberOfSides: Int = 0
    var name: String

    init(name: String) { // initializer
        self.name = name // 속성 초기화
    }

    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

deinit 을 통해 객체가 할당 해제되기 전에 필요한 작업을 수행할 수 있다.

자식 class 들은 클래스명 뒤에 colon(:) 뒤에 부모 클래스명을 받는다.
override 를 통해 부모 클래스에서 구현된것을 재정의할 수 있다.
하지만 실수로 재정의 없이 override를 사용한 경우 compiler를 통해 error로 감지됩니다.

class Square: NamedShape { // 상속받은 class
    var sideLength: Double

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength // 초기화 먼저
        super.init(name: name) // 상위 클래스 초기화
        numberOfSides = 4
    }

    func area() -> Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String { // 재정의 함수
        return "A square with sides of length \(sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

속성은 getter, setter를 지닐 수 있다.
getter 를 통해 computed property로 사용될 수 있다.
setter 에서 newValue 값을 통해 새로설정되는 값을 사용할 수 있다.

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
        get {
            return 3.0 * sideLength // 계산된 값이 반환된다.
        }
        set {
            sideLength = newValue / 3.0 // 설정되는 값이 newValue로 사용된다.
        }
    }

    override func simpleDescription() -> String {
        return "An equilateral triangle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
// Prints "9.3"
triangle.perimeter = 9.9
print(triangle.sideLength)
// Prints "3.3000000000000003

또한 setter 에서 set 이후 괄호를 통해 newValue 값을 임의의 변수명으로 사용할 수 있다.

set(nValue) {
	sideLength = nValue / 3.0
}

상속받은 자식 class 의 초기화 작업은 세가지 순서에 따르게 된다.
1. 자식 class의 변수 초기화
2. 부모 class의 init
3. 부모 class의 변수 수정
함수 사용, getter와 setter 등의 설정 작업은 이 이후에 가능하다.

willSet, 또는 didSet 키워드를 통해 new value 로 설정되기 전, 후에 실행되는 코드를 작성할 수 있다.
아래 예시코드의 경우 triangle 과 square 의 sideLength 는 항상 동일하게 유지된다.

class TriangleAndSquare {
    var triangle: EquilateralTriangle {
        willSet {
            square.sideLength = newValue.sideLength
        }
    }
    var square: Square {
        willSet {
            triangle.sideLength = newValue.sideLength
        }
    }
    init(size: Double, name: String) {
        square = Square(sideLength: size, name: name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
// Prints "10.0"
print(triangleAndSquare.triangle.sideLength)
// Prints "10.0"
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)
// Prints "50.0"

optional 변수에 ? 를 붙여 함수나 속성을 사용할 수 있다.
만약 ? 이전 값이 nil일 경우는 ? 이후 모든 값은 nil로 처리된다.
반대로 ? 이전 값이 nil이 아닌 경우는 unwrapped 된 값이 되며, 최종 결과값은 optional 값이 된다.

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") // 옵셔널 변수
let sideLength = optionalSquare?.sideLength // unwrapped 된 Square 타입의 sideLength 값이 되며, 최종 타입은 optional

Reference

다음에서 발췌
docs.swift.org
The Swift Programming Language (Swift 5.5) Apple Inc.
이 자료는 저작권에 의해 보호됩니다.

profile
 iOS Developer

0개의 댓글