본문 바로가기

스피드 문법정리

14. Structure and Class

Structure

struct StructName {
    property
    method
    initalizer
    subscript
}
struct Person {
    var name : String
    var age : Int
    
    func speak() {
        print("Hello")
    }
}
let p = Person(name : "Steve", age : 50)
p.name // Steve
p.age // 50
p.speak() // Hello

Class

class ClassName {
    property
    method
    initalizer
    deinitializer
    subscript
}
class Person {
    var name = "John Doe"
    var age = 0
    
    func speak()
        print("Hello")
    }
}
let p = Person()
p.name // John Doe
p.age // 0
p.speak() // Hello

Initializer Syntax

생성자는 속성 초기화가 가장 중요하고 유일한 목적,  생성자 실행이 종료되는 시점에는 모든 속성에 초기값이 저장되어있어야 함

열겨형, 구조체, 클래스는 모두 설계도, 설계도에 따라서 인스턴스를 만들기 위해서는 초기화 과정이 반드시 필요, 생성자를 호출하면 초기화가 시작되고, 생성자 실행이 완료되면 모든 속성이 초기화됨, 에러 없이 초기화가 완료되면 인스턴스 생성

init(parameters) {
    statements
}

class Position {
    var x : Double
    var y : Double
    
    init() {
        x = 0.0
        y = 0.0
    }
    init(value : Double) {
        x = value
        y = value
    }
}

let a = Position()
a.x // 0
a.y // 0

let a = Position(value : 100)
a.x // 100
a.y // 100

Value Types and Reference Types

Value Types Reference Types
구조체(기본자료형), 열거형, 튜플, swift collection 클래스, 클로져
복사본 전달 메모리 주소 전달
상대적으로 적은 데이터 전달, 상속이 불필요한 경우
값이 전달될때 마다 복사본이 생성되어야하는 경우
연관된 상수 그룹을 표현할 경우 열거형
코드내에서 한번만 사용되는 형식은 튜플
나머지 값 형식은 구조체
나머지 대부분 클래스 구현
값 형식이 저장되는 메모리 공간 = stack 값을 heap에 저장, 메모리주소를 stack에 저장 (2곳에 저장)
// 속성은 생성과 동시에 기본값 저장중 -> 파라미터가 없는 생성자가 자동으로 제공 -> 기본생성자
struct PositionValue {
   var x = 0.0
   var y = 0.0   
}

class PositionObject {
   var x = 0.0
   var y = 0.0   
}

var v = PositionValue()
// x = 0, y = 0
var o = PositionObject()
// x = 0, y = 0

var v2 = v
// x = 0, y = 0
var o2 = o
// x = 0, y = 0

v2.x =12
v2.y = 34

v
// x = 0, y = 0
v2
// x = 12, y = 34

o2.x =12
o2.y = 34

o
// x = 12, y = 34
o2
// x = 12, y = 34

Identity Operator

인스턴스의 주소를 비교

같은 메모리 주소가 같다면 Identiacl 이 같다고 표현하고 값이 같다면 Equal로 표현

classInstance === classInstance // Identical to Operator
classInstance !== classInstance // Not Identical to Operator

class A {
}
let a = A()
let b = a
let c = A()

a === b // true
a !== b // false
a !== c // true

Nested Types

String.CompareOptions

class One {
    struct Two {
        enum Three {
            case a
            
            class Four {
            }
        }
    }
    var a = Two() // = One.Two()  class One 내부에 있기 때문에 One 생략 가능
}

let two : One.Two = One.Two()
            
          

'스피드 문법정리' 카테고리의 다른 글

16. Method and Subscript  (0) 2020.06.19
15. Property  (0) 2020.06.18
13. Enumeration  (0) 2020.06.17
12. Collection  (0) 2020.06.16
9. Functions  (0) 2020.06.15