TIL17 ✨

YaR Lab·2023년 5월 16일
0

TIL✨

목록 보기
7/136
post-thumbnail

23.05.16

IBOutlet에 weak을 쓰는이유

메모리 누수 방지

var testBool: Bool = Bool() // false
var testInt: Int = Int() // 0
print(testBool)
print(testInt)

inheritance

swift에서는 단일 상속만 가능하다

final

다른 클래스의 상속을 금지하고, 최후의 클래스라고 선언

final class Human {
    var name: String?
    var age: Int?
}

type conversion VS type casting

Swift에서 "Type Conversion"과 "Type Casting"은 약간 다른 개념을 가지고 있습니다.

  1. Type Conversion (타입 변환):

    • Swift에서 "Type Conversion"은 데이터 타입 간의 자동 변환이나 명시적인 변환을 의미합니다.
    • 일반적으로 Swift의 기본적인 타입들 사이에서는 자동으로 타입 변환이 이루어집니다. 예를 들어, IntDouble은 서로 다른 타입이지만, Swift에서는 필요한 경우 자동으로 타입을 변환하여 연산을 수행할 수 있습니다.
    • 또한, 명시적인 타입 변환을 수행하기 위해 as 키워드를 사용할 수 있습니다. 이는 컴파일러에게 해당 값이나 인스턴스를 다른 타입으로 강제로 변환하도록 지시하는 역할을 합니다.
  2. Type Casting (타입 캐스팅):

    • Swift에서 "Type Casting"은 객체 지향 프로그래밍의 상속 관계에 기반한 개념입니다.
    • 클래스나 프로토콜을 기준으로 객체의 실제 타입을 확인하고, 그에 맞게 객체를 다른 클래스나 프로토콜 타입으로 캐스팅하는 것을 의미합니다.
    • Swift에서는 as?as! 키워드를 사용하여 동적 형변환을 수행할 수 있습니다. as?는 조건부 타입 캐스팅으로, 변환이 실패하면 nil을 반환합니다. as!는 강제 타입 캐스팅으로, 변환이 실패하면 런타임 오류가 발생합니다.

따라서, "Type Conversion"은 데이터 타입 간의 변환을 일반적으로 다루는 개념이고, "Type Casting"은 객체의 실제 타입을 확인하고 다른 타입으로 캐스팅하는 객체 지향 프로그래밍에서 사용되는 개념입니다.

type casting

인스턴스의 타입 확인
해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법
타입이 프로토콜에 적합한지 여부도 확인할 수 있음

is

Checking Type
표현식이 타입과 동일하거나 서브 클래스인 경우 true를 반환하고, 그 이외의 경우에는 false를 반환한다.

let char: Character = "A"
 
char is Character       // true
char is String          // false
 
 
let bool: Bool = true
 
bool is Bool            // true
bool is Character       // false
class Human {
    let name: String
    init(name: String) {
        self.name = name
    }
}
class Teacher: Human { }
class Student: Human { }
 
 
let people: [Human] = [
    Teacher.init(name: "김선생"),
    Student.init(name: "박제자"),
    Student.init(name: "유제자")
]

for human in people {
    if human is Teacher {
        print("나는야 선생님 : \(human.name)")
    } else if human is Student {
        print("나는야 제자  : \(human.name)")
    }
}

Upcasting

서브 클래스 인스턴스를 "슈퍼 클래스의 타입"으로 참조
업 캐스팅은 항상 성공
as 연산자를 사용

// 1. as를 사용한 업캐스팅
let human1 = Teacher.init() as Human
 
// 2. Type Annotation을 사용한 업캐스팅
let human2: Human = Teacher.init()

Downcasting

슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용
다운 캐스팅은 실패할 수있기에 as?, as! 연산자를 이용
다운 캐스팅은 실패할 수 있음

as?: "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 nil을 리턴

as!: "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 에러 발생

화면전환

https://seungchan.tistory.com/entry/1차-세미나-ViewController-화면-

(Info) infomation property list -> 앱의 초기 default값들을 설정

Navigation Conroller root view

argument label, parameter name

func greet(person name: String) {
    print("Hello, \(name)!")
}

greet(person: "John")

"person"은 argument label, "name"은 parameter name

func labelTest(label name: String) {
    print(name)
}
func argTest(name: String) {
    print(name)
}
func noLabelTest(_ name: String) {
    print(name)
}

labelTest(label: "라벨")
noLabelTest("없음") 
argTest(name: "이름")

클로저

Named Closure: func키워드로 선언하는 일반적인 함수
Unnamed Closure: 익명함수

{(Parameters) -> Return Type in 실행구문}

클로저 헤드: in키워드 왼쪽
클로저 바디: in키워드 오른쪽

let closure = { (name: String) -> String in
    return "Hello, \(name)"
}

클로저는 argument label을 사용하지 않는다

closure("Sodeul")
closure(name: "Sodeul")  //error!

일급객체로서의 클로저

ⓛ 클로저를 변수나 상수에 대입할 수 있다

let closure = { () -> () in
    print("Closure")
}

② 함수의 파라미터 타입으로 클로저를 전달할 수 있다

func doSomething(closure: () -> ()) {
    closure()
}

③ 함수의 반환 타입으로 클로저를 사용할 수 있다

func doSomething() -> () -> () {
}

클로저 실행

let closure = { () -> String in
    return "Hello Sodeul!"
}

closure()

//OR

({ () -> () in
    print("Hello Sodeul!")
})()

0개의 댓글