글 작성자: 만렙개발자

1. 옵셔널

  • 값이 있을 수도 있고, 없을 수도 있다.
  • nil의 가능성을 명시적으로 표현 (문서화 필요 X)
  • 전달받은 값이 옵셔널이 아니라면, nil 체크할 필요가 없음 (=예외처리할 필요 없음)
  • 옵셔널이 아닌 상수에 nil을 할당하면 컴파일 오류
// 옵셔널은 다음과 같이 enum과 general을 이용하여 선언되어 있음
enum Optional<Wrapped> : ExpressibleByNilLiteral {
	case none // 옵셔널에 값이 없다 (열거형이기에 switch case문으로 구성)
    case some(Wrapped) // 옵셔널에 값이 있다
}

let optionalValue: Optional<Int> = nil
let optionalValue: Int? = Int // 위와 동등한 표현

func exFunction(optionalParameter: Int?) {
	// something
}

// 기존 변수처럼 사용 불가 
optionalValue = optionalValue + 1 // [Error] 다른 타입이기에

2) 암시적 추출 옵셔널 (Implicitly Unwrapped Optional)

  • 기존 변수처럼 사용 가능
// 기존 변수처럼 사용 가능
optionalValue = optionalValue + 1

// nil 할당 가능
optionalValue = nil

// 런타임 오류 발생
optionalValue = optionalValue + 1 // [Error] nil + 1 ?

3) 옵셔널 추출 (Optional Unwrapping) 

  • 옵셔널을 어떻게 꺼내서 사용하는지, 활용하는지
  • 옵셔널 바인딩 (Optional Binding): nil check & unwrap (value extraciton)
var source: String! = "src.jpg"
var result: String! = nil

if let src: String = source, let res = result {
	print("\(src) to \(res)")
} else {
	print("source == nil")
}

2. 구조체

  • 구조체는 값(value) 타입
    • 관련있는 값들을 모아서 하나의 데이터 타입으로 표현하고 싶은 경우
    • 상속이 필요 없는 경우
  • 상속이 불가능
  • 대부분의 타입이 구조체로 이루어져 있음
struct Desert {
	var mutableProperty: Int = 1
    let immutableProperty: Int = 2
    
    static var typeProperty: Int = 3
    
    func instanceMethod() {
    	print("instance method is called")
    }
}

var mutable: Calendar = Calendar()

3. 클래스

  • 클래스는 참조(reference) 타입
  • Swift에서는 다중 상속을 허용하지 않음
  • 대부분의 Apple 프레임워크는 클래스로 이루어져 있음
class Desert {
	var name: String = ""
    var `kind`: String = "Cake"
    
    func printNameKind() {
        print("이 디저트는 \(name) \(self.kind)입니다.")
    }
}

var bf: Desert = Desert()
bf.name = "black forest"
bf.printNameKind()