본문 바로가기
Smart Device/Swift

Swift struct

by 언덕너머에 2014. 7. 2.

- struct

구조체를 만들기 위해서는 struct를 사용한다. 구조체는 클래스의 함수나 초기화 등과같은 많은 같은 

동작을 제공한다. 구조체와 클래스의 중요한 차이점중에 하나로 구조체는 코드에 값을 전달하고 클래스는 참조를 전달하는 것이다.


예1)

struct Card {

    var rank: Rank

    var suit: Suit

    func simpleDescription() -> String {

        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"

    }

}

let threeOfSpades = Card(rank: .Three, suit: .Spades)

let threeOfSpadesDescription = threeOfSpades.simpleDescription()


예2)

struct Point {

    var x = 0.0, y = 0.0

}


struct Size {

    var width = 0.0, height = 0.0

}


struct Rect {

    var origin = Point()

    var size = Size()

    var center: Point {

        get {

            let centerX = origin.x + (size.width / 2)

            let centerY = origin.y + (size.height / 2)

            return Point(x: centerX, y: centerY)

        }

        set(newCenter) {

            origin.x = newCenter.x - (size.width / 2)

            origin.y = newCenter.y - (size.height / 2)

        }

    }

}


var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))

let initialSquareCenter = square.center

square.center = Point(x: 15.0, y: 15.0)


println("square.origin is now at (\(square.origin.x), \(square.origin.y))")

//-->square.origin is now at (10.0, 10.0)


-

위 소스에서 

        set(newCenter) {

            origin.x = newCenter.x - (size.width / 2)

            origin.y = newCenter.y - (size.height / 2)

        }

는 다음과 같이 변경 가능하다.

        set {

            origin.x = newValue.x - (size.width / 2)

            origin.y = newValue.y - (size.height / 2)

        }

set이 호출될 때 사용되는 타입이 무엇인지 알고 있기 때문이다. 단 이 경우에는 파라미터 이름은 받드시

newValue라고 해야 한다.


-

연산속성에서 set이 없을 경우, get 키워드를 생략할 수 있다.

예)

struct Cuboid {

    var width = 0.0, height = 0.0, depth = 0.0

    var volumn: Double {

        return width * height * depth

    }

}


mutating

기본적으로 값 타입의 경우는 인스턴스가 생성되고 나서, 인스턴스 매서드에서 해당 인스턴스의 속성을 변경할 수 

없도록 되어 있다. 그러나 값 타입의 경우라고 하더라도 인스턴스 매서드를 사용하여 구조체와 열거형의 속성을 

변경할 필요가 있는 경우가 발생한다. 이 경우에 mutating이라는 키워드를 사용하면 된다.

struct Point {

    var x = 0.0, y = 0.0

    mutating func moveByX(deltaX: Double, y deltaY: Double) {

        x += deltaX

        y += deltaY

    }

}

var somePoint = Point(x: 1.0, y:1.0)

somePoint.moveByX(2.0, y: 3.0)

//-->{x 3, y 4}


'Smart Device > Swift' 카테고리의 다른 글

Swift Generics  (0) 2014.07.03
Swift protocol  (0) 2014.07.03
Swift Enumerations  (0) 2014.06.29
Swift Objects and Classes #3  (0) 2014.06.29
Swift Objects and Classes #2 - Properties getter setter  (0) 2014.06.24