개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.
assert & guard
애플리케이션이 동작하는 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 도와준다.
Assert
어떤 결과들을 확인해보는데 사용한다. 디버깅 모드에서만 동작 하고, 배포하는 애플리케이션에서는 동작하지 않는다.
디버깅 중에서도 예상했던 조건들이 확실히 맞는가를 확인할 때 사용한다.
varsomeInt:Int=0// someInt가 0이 맞으면 그냥 지나가고 아니면 someInt != 0 메시지를 반환assert(someInt==0),"someInt != 0")
Early Exit
빠른 종료를 위해 사용한다.
디버깅 구문에서만 사용가능한 assert와는 다르게 guard는 어떤 조건에서도 동작 을 한다.
guard를 사용하여 잘못된 값이 전달됐을 시 특정 실행구문을 빠르게 종료시킨다.
guard의 else 블럭 내부 에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 한다.
타입 캐스팅, 옵셔널과도 자주 사용되며 그 외 단순 조건 판단 후 빠르게 종료할 때도 용이다.
funcfunctionWithGuard(age:Int?){guardletunwrapperdAge=age,unwrapperdAge<130,unwrapperdAge>=0else{print("나이값 입력이 잘못되었습니다.")return}print("당신의 나이는 \(unwrapperdAge)세 입니다")}
if let은 블럭 안에서만 사용가능했지만 guard let은 블럭 바깥에서도 계속 사용할 수 있다.
as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.
Any 혹은 AnyObject로도 타입 정보를 변환할 수 있다. > 암시적으로 처리되므로 생략해도 무방하다
varmike:Person=UniversityStudent()asPersonvarjenny:Student=Student()varjina:Any=Person()// as Any 생략가능varjina:UniversityStudent=Person()asUniversityStudent// 컴파일 오류
Person타입이라고 하더라도 UniversityStudent의 인스턴스가 들어올 수 있다 » 왜냐면 대학생은 사람이기 때문
다운 캐스팅 - as? 또는 as!
자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.(사람으로 지정했는데 학생일수도 있느냐?)
그런데 이렇게 되면 init이 너무 많아지게 된다. 중복되는 코드도 늘어나고…
이 경우에는 아래에 미리 만들어진 init을 사용하면된다. 이때 자신의 init을 사용할때 convenience를 init 앞에 붙여주면 된다.
classPersonC{varname:Stringvarage:IntvarnickName:String?convenienceinit(name:String,age:Int,nickName:String){self.init(name:name,age:age)self.nickName=nickName}init(name:String,age:Int){self.name=nameself.age=age}}// 아래와 같이 init을 다양한 모습으로 사용이 가능하다leth:PersonC=PersonC(name:"h",age:10)lets:PersonC=PersonC(name:"s",age:20,nickName:"에스")
암시적 추출 옵셔널(!)
암시적 추출 옵셔널은 인스턴스 사용에 꼭 필요하지만, 초기값을 할당하지 않고자 할 때 사용한다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.
상속(Inheritance)
스위프트에서의 상속은 클래스, 프로토콜 등에서 사용 가능
열거형, 구조체에는 상속이 불가능
다중상속은 지원하지 않음
class 이름: 상속받을 클래스 이름 {
구현부
}
예시는 아래와 같다.
classPerson{varname:String=""funcselfIntroduce(){print("저는 \(name) 입니다.")}// final 키워드를 사용해 자식클래스에서 재정의를 방지할 수 있다 - override 불가능finalfuncsayhello(){print("hello")}// 타입메서드 - 재정의 불가staticfunctypeMethod(){print("type method - static")}classfuncclassMethod(){print("type method - class")}// 재정의 가능한 class 메서드지만 final 키워드를 사용하면 재정의 할 수 없다.(static = final class)finalclassfuncfinalClassMethod(){print("type method - final class")}}classStudent:Person{varmajor:String=""oerridefuncselfIntroduce(){print("저는 \(name)이고, 전공은 \(major)입니다")}overrideclassfuncclassMethod(){print("overriden type method - class")}}
Student 클래스는 Person클래스를 상속받아 온것이기 때문에 아래의 코드는 실행이 안된다.
var name: String > name 변수를 재정의하는 행위
override static func typeMethod() > static을 사용한 타입메서드 재정의
override func sayhello() > final 키워드를 사용한 메서드나 프로퍼티 재정의
oveeride class func finalClassMethod() > final class를 사용한 타입메서드 재정의
letzehye:Person=Person()lethana:Student=Student()zehye.name="zehye"hana.name="hana"hana.major="Swift"zehye.selfIntroduce()// 저는 zehye입니다.hana.selfIntroduce()// 저는 hana이고, 전공은 Swift입니다.Person.classMethod// type method - classPerson.typeMethod()// type method - ststicPerson.finalClassMethod()// type method - final classStudent.classMethod()// overriden type method - classStudent.typeMethod()// type method - ststicStudent.finalClassMethod()// type method - final class