메모리 누수 방지
var testBool: Bool = Bool() // false
var testInt: Int = Int() // 0
print(testBool)
print(testInt)
swift에서는 단일 상속만 가능하다
다른 클래스의 상속을 금지하고, 최후의 클래스라고 선언
final class Human {
var name: String?
var age: Int?
}
Swift에서 "Type Conversion"과 "Type Casting"은 약간 다른 개념을 가지고 있습니다.
Type Conversion (타입 변환):
Int
와 Double
은 서로 다른 타입이지만, Swift에서는 필요한 경우 자동으로 타입을 변환하여 연산을 수행할 수 있습니다.as
키워드를 사용할 수 있습니다. 이는 컴파일러에게 해당 값이나 인스턴스를 다른 타입으로 강제로 변환하도록 지시하는 역할을 합니다.Type Casting (타입 캐스팅):
as?
와 as!
키워드를 사용하여 동적 형변환을 수행할 수 있습니다. as?
는 조건부 타입 캐스팅으로, 변환이 실패하면 nil
을 반환합니다. as!
는 강제 타입 캐스팅으로, 변환이 실패하면 런타임 오류가 발생합니다.따라서, "Type Conversion"은 데이터 타입 간의 변환을 일반적으로 다루는 개념이고, "Type Casting"은 객체의 실제 타입을 확인하고 다른 타입으로 캐스팅하는 객체 지향 프로그래밍에서 사용되는 개념입니다.
인스턴스의 타입 확인
해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법
타입이 프로토콜에 적합한지 여부도 확인할 수 있음
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)")
}
}
서브 클래스 인스턴스를 "슈퍼 클래스의 타입"으로 참조
업 캐스팅은 항상 성공
as 연산자를 사용
// 1. as를 사용한 업캐스팅
let human1 = Teacher.init() as Human
// 2. Type Annotation을 사용한 업캐스팅
let human2: Human = Teacher.init()
슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용
다운 캐스팅은 실패할 수있기에 as?, as! 연산자를 이용
다운 캐스팅은 실패할 수 있음
as?: "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 nil을 리턴
as!: "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 에러 발생
https://seungchan.tistory.com/entry/1차-세미나-ViewController-화면-
(Info) infomation property list -> 앱의 초기 default값들을 설정
Navigation Conroller root view
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!")
})()