class Person {
var name: String
var age: Int
init(name: String ,age: Int) {
self.name = name
self.age = age
}
convenience init(name: String) {
self.init(name: name, age: 30)
}
}
is, as (타입캐스팅)
is
서브 클래스인지 확인 하는 연산자로, bool 을 리턴한다.
let test: Character = "A"
test is Character // true
test is String // false
as
업캐//스팅 혹은 다운캐스팅 시에 사용한다.
//업캐스팅
let human = Teacher.init() as Human // 상위 클래스인 Human 타입으로 변수가 선언된다.
//다운캐스팅 - 부모클래스를 자식클래스로 캐스팅 하는 것으로 실패할 수도 있다.
//as? 로 다운캐스팅 시 성공하면 옵셔널 Student 로 변수를 갖게 되고, 실패시 nil을 갖게 된다.
let student: Student? = human as? Student
//as! 로 다운캐스팅시 옵셔널 강제 해제이므로, 즉시 Student 변수를 갖게 되지만, 실패시 에러를 발생시킨다.
let student2: Student = human as! Student
Any, AnyObject
Any
클래스, 열거형, value 형 전부 지칭 가능하다.
var array: [Any] = []
array.append(1)
array.append("asdf)
AnyObject
클래스 타입만 지칭한다.
var array: [AnyObject] = []
array.append(Human("헤헤"))
array.append(1) //error!
mutating
스위프트에서 클래스는 레퍼런스 타입이고, 구조체와 열거형은 값 타입이다.
값 타입의 내부 속성은 기본적으로 인스턴스 내 메소드에서 수정할 수 없다.
값타잆의 속성을 내부에서 수정하려면 내부 메소드에 mutating 키워드를 붙여야 한다.
struct Point {
var x = 0
var y = 0
//mutating 을 붙이면 self 프로퍼티에 새로운 인스턴스를 할당할 수 있다.
mutating func move(dx: Int, dy: Int) {
self = Point(x+ dx, y+dy)
}
}
struct Stack {
var stack = [Int]()
//struct는 값타입 이기 때문에 mutating이 없으면 내부 속성을 수정할 수 없다.
mutating func push(_ item: Int) {
stack.append(item)
}
}
@AutoClosure
함수 선언시 클로저형 파라미터를 함수 사용 부분에서 단순 선언부 처럼 사용할 수 있다.
func test(closure: @autoclosure () -> ()) {
closure()
}
test(closure: 1 > 2)
- autoclosure 는 파라미터가 없어야 한다. 리턴 타입은 상관 없다.
convenience init
오브젝트 이니셜라이저를 도와주는 역할 이다.
일반적인 이니셜라이저(designated init)은 모든 필드를 반드시 초기화 해줘야 한다.
convenience init 은 넘어오지 않은 값은 임의로 초기화 하도록 도와준다.
class person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String) {
init(name: name, age: 20)
}
}
'IOS' 카테고리의 다른 글
스위프트 Attributes (0) | 2022.10.04 |
---|---|
스위프트 Generic (0) | 2022.10.04 |
스위프트 Property Wrapper (0) | 2022.10.04 |
스위프트 Optional (0) | 2022.10.04 |
스위프트 프로퍼티 (2) | 2022.10.04 |