- Any, 타입 체크(is)
- as, as?, as!
- 접근 제한자
Any와 타입 체크
- 변수/상수: 선언할 때 타입 확정
- 다른 타입의 값 대입 금지
- Any, AnyObject
- 가변 타입
- Any: 모든 타입
- AnyObjct: 모든 레퍼런스 타입
Any
- 타입에 대한 정보가 없음
- 타입별 메소드, 프로퍼티 사용불가
- 타입 체크, 타입 캐스팅이 필요합니다
- 타입 정보 얻기 =
type(of:)
- Any는 모든타입이라고 하지만, nil 을 대입하려면 Any? 로 선언해서 대입 해야함
타입 체크
- 타입체크 키워드
is
var anyVar: Any = 3
if anyVar is Int {
print("정수 타입")
}
- 예시
class Animal {}
class Dog : Animal {}
class Cat : Animal {}
let raz: Animal = Cat("고양이")
raz is Cat // true
raz is Animal // true
raz is Dog // false
타입 변환
- 타입변환 키워드
as
- as: 타입변환이 확실한 경우
- 상속관계에 있을 경우
- 업 캐스팅일 경우
- as?: 타입 변환 실패시 nil 반환, 옵셔널
- as!: 강제 타입 변환, 변환 실패시 앱 크러쉬
- as: 타입변환이 확실한 경우
- 예시
* 옵셔널 바인딩을 통해서도 사용함
if let intVal3 = anyVal as? Int {
print("변환 성공")
}
* 업캐스팅 -> 항상 성공
let raz = Cat()
let animal = raz as Animal
-- Animal
----Cat
----Dog
* 다운캐스팅 실패 가능성 있음.
let obj : Animal = Dog()
let doggy1 = obj as Dog // 컴파일 에러
let doggy2 = obj as? Dog // 변환 성공, 옵셔널 타입
let doggy3 = obj as! Dog // 변환 성공, Non-Optional Type
- 프로토콜과 as
protocol Sing {}
struct Bird : Sing {}
let sparrow : Any = Bird()
// 프로토콜의 타입을 확인
sparrow is Sing
// 프로토콜로 타입 변환
let singing = sparrow as? Sing
접근 제한자
- open: 다른 모듈 접근 가능, 다른 모듈에서 상속 가능
- public: 다른 모듈 접근 가능, 다른 모듈에서 상속 불가, 같은 모듈 상속 가능
- internal: 같은 모듈내에서만 접근 가능, 기본값
- fileprivate: 같은 소스 파일에서만 접근 가능
-
private: 정의된 블록 내에서만 접근가능
-
모듈
: 프로젝트를 만들면, 하나의 모듈로 묶임, 다른 라이브러리나, 다른 프레임 워크들은, 현재 모듈과 다른 모듈입니다. - 접근 조절 단위
- 타입
- 메소드
- 프로퍼티
- 상위에 대한 접근 레벨을 넘어설수는 없음: Class 는 internal로 만들었는데, 내부의 메소드나, 프로퍼티들은 open, public 으로 만들수는 없음.