클래스 vs 객체 vs 인스턴스
클래스로부터 만들어진 객체를 인스턴스라고 부른다.
형 변환 upcasting
상속관계 있는 클래스들 끼리만 타입 캐스팅 가능
자식(부모로부터 상속받아 더 많은것을 가지고 있음) 인스턴스를 부모로 캐스팅 하는것은 문제 없다
as연산자를 이용한 타입 변환
자식인스턴스 as 부모클래스 -> upcasting 안전한 캐스팅. 자식이 추상화 됨
업 캐스팅은 객체를 부모클래스의 객체로 형 변환
형변환은 성공할 것이기 때문에 보장된 변환
UIButton
은 UIControl
의 자식 클래스이므로 안전하게 형 변환 가능
코딩 : 자식인스턴스 as 부모클래스
let myButton: UIButton = UIButton()
let myControl = myButton as UIControl // 자식인스턴스인 myButton을 부모 클래스형으로 형 변환
as? as! -> downcasting
다운캐스팅은 부모 인스턴스를 자식 클래스로 변환하는데 사용
성공 확신이 있으면 as! 로 강제변환 -> 변환이 안되면 crash
성공 확신이 없으면 as? 로 안전하게 변환 -> 변환이 안되면 nil 리턴 (옵셔털 타입으로 반환함)
let myTextView = myScrollView as! UITextView // 부모인스턴스 as! 자식클래스
if let classB = classA as? UITxexView { // 옵셔널형이므로 옵셔널바인딩 수행
print("Type cast to UITextView succeeded")
} else {
print("Type cast to UITextView failed")
}
타입 검사 : is
지정된 객체가 특정 클래스의 인스턴스인지 검사
코딩 : 인스턴스 is 클래스
if myobject is MyClass {}
class A {} // 클래스 A
var a : A = A() // 클래스 A의 객체 a
if a is A {
print("Yes")
}
AnyObject
어떤 클래스의 객체도 저장 가능 -> 범용 타입
상속관계가 아니라도 타입 캐스팅 가능한 타입
가장 추상화된 최상위 개념 (Obj-C 의 NSObject)
클래스만 허용하며 구조체나 열거형은 허용하지 않음
Any
클래스 인스턴스 뿐만 아니라 모든 것을 포함함
클래스, 구조체, 열거형, 함수타입도 가능
기본 할당 연산자
할당 연산자 (=) 는 두 개의 피연산자를 가짐
왼쪽에 있는 피연산자는 값이 할당되는 변수 또는 상수이며, 오른쪽에 있는 피연사자는 할당할 값
var x: Int? // 옵셔널 Int 변수 x 선언
var y = 10 // 변수 y에 10 의 값을 할당
x = 10 // 10의 값을 x에 할당 -> Optional(10)
x = x! + y // x의 값을 언래핑 하고 y의 값을 더하여 다시 x에게 할당함 -> Optional(20)
x = y // y의 값을 x에게 할당함 -> Optional(10)
복합 할당 연산자
x += y -> 변수 x 의 값 + 변수 y의 값 의 결과를 변수 x에 다시 저장함.
+= , -= , *= , /= , %=
증가 연산자와 감소연산자
x = x + 1 -> x += 1
x = x - 1 -> x -= 1
x++ , x-- 는 없어짐
비교연산자
== , > , >= , < , <= , !=
범위 연산자
5...8 -> 5,6,7,8
5..<8 -> 5,6,7
let names = ["A", "B", "C", "D"]
for name in names[2...] {
print(name)
} // -> C
// -> D
삼항 연산자 -> ? :
비교 연산을 빠르게 하기 위해 삼항 연산자를 사용한다.
삼항 연산자는 [조건] 부분을 계산하여 true 이면 [참 표현식] 부분이 실행되며, 거짓이면 [거짓 표현식] 부분이 실행된다.
코딩 : [조건] ? [참 표현식] : [거짓 표현식]
var l = 1
var k = 2
print("largest number is \(l > k ? l : k)")
Nil-Coalescing Operator (Nil합병연산자) : ??
옵셔널 변수의 값이 nil 이면 ?? 다음 값으로 할당됨
코딩 : 옵셔널변수 ?? nil일 때 할당 되는 값
let defaultAge = 1 // defaultAge 상수에 1 의 값을 할당
var age : Int? // 변수 age를 옵셔널Int로 선언
age = 3 // 옵셔널Int인 변수 age에 3의 값을 할당
print(age) // Optional(3)
var myAge = age ?? defaultAge // 옵셔널변수 age의 값이 nil 이면 defaultAge 값을 할당
print(myAge) // 옵셔널변수age에 3의 값이 할당 되어 있으므로 값을 출력. -> 3
let defaultColor = "black" // 상수 defaultColor 에 "black" 값을 할당
var userDefinedColor: String? // 옵셔널변수 선언
var myColor = userDefinedColor ?? defaultColor // 변수myColor에 옵셔널변수의 값이 nil이므로 "black" 할당
print(myColor) // black
userDefinedColor = "red" // 옵셔널변수에 "red" 할당
myColor = userDefinedColor ?? defaultColor //옵셔널변수에 "red" 값이 있으므로 myColor에 "red" 할당
print(myColor) // red -> Optional(red) 가 아님을 주의 해야함
for-in 반복문
컬렉션 또는 숫자 범위 내에 있는 목록을 반복
'상수명'은 반복문이 돌면서 컬렉션 또는 범위에서 가져온 항목을 담게 될 상수
'컬렉션 또는 범위'는 반복문이 반복되면서 현재의 항목을 참조
코딩 : for 상수명 in 컬렉션 또는 범위 { 실행될 코드 }
for index in 1...5 { // _ 로 참조체(i) 생략 가능하다
print(index)
}
for _ in 1...5 {
print("Hi")
}
for i in 1...5 {
print("\(i) Hi")
}
let names2 = ["Anna", "Alex", "Brian", "Jack"]
for ii in names {
print(ii)
}
dictionary의 항목 접근
dictionary는 key:value 형식의 배열
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \(legCount) legs")
}
while 반복문
for 반복문은 몇 번 정도 반복해야 할지 이미 아는 경우에 사용하기 적합
어떤 조건을 만족할 때 까지 반복해야 하는 경우 while 반복문 사용
코딩 : while 조건식 { 반복코드 }
var myCnt = 0
while myCnt < 1000 {
myCnt += 1
}
print(myCnt) // 1000
repeat-while 반복문
스위프트의 do...while 반복문과 같다
적어도 한번은 실행함
코딩 : repeat { 반복코드 } while 조건식
var i = 10
repeat {
i -= 1
print(i)
} while (i > 0)
반복문 빠져 나오기 : break
반복문이 완료되는 조건 전에 반복문을 빠져나오는 어떤 조건을 만들 수 있다.
반복문에서 빠져나오기 위하여 break 사용
현재의 반복문에서 빠져나와 반복문 바로 다음 코드로 넘어간다
for pp in 1...10 {
if pp == 5 {
break
}
print(pp)
}
continue
반복문에서 continue 이후의 모든 코드를 건너뛰고 반복문의 상단 시작 위치로 돌아감
for i in 1...10 {
if i % 2 == 0 {
continue
}
print(i)
}
2,4,6,8,10 은 조건에 해당되어 건너뜀
1,3,5,7,9 는 조건에 해당되지 않아 밑의 코드를 진행함
if
true면 괄호로 감싸인 코드 진행, false 이면 스킵
else if 는 위의 조건들이 false일때 실행 할 불리언과 코드를 지정
else 는 모든 if 불리언들이 false 일때 실행될 코드를 지정
코딩 : if 불리언 { true일때 실행될 코드 }
var num = 3
if num == 1 || num == 3 {
print("man")
} else if num == 2 || num == 4 {
print("woman")
} else {
print("foreigner")
}
guard : 조건식이 false 일때 실행
표현식이 false로 판단될 경우에 수행할 else 절을 반드시 포함해야함
else에는 현재 코드 흐름을 빠져나갈 (return, break, countinue, throw) 구문을 반드시 포함
다른 함수를 else 코드 블록 안에서 호출할 수도 있음
특정 조건에 맞지 않을 경우 현재 함수나 반복문에서 빠져나갈수 있도록 '조기출구' 전략을 제공
코딩 : guard < 불리언 표현식 > else { fales일때 실행될 코드 / 빠져나갈 구문 } true일 경우 실행될 코드
ex1)
func printName(firstName:String, lastName:String?) {
//if let
if let lName = lastName {
print(lName,firstName)
}
else {
print("성이 없네요!")
}
//guard let
guard let lName = lastName else {
print("성이 없네요!")
return
}
print(lName,firstName)
}
printName(firstName: "길동", lastName: nil)
// lastName 이 nil 값을 가진다면 guard let 을 사용하여 if let 보다 빠르게 탈출 가능 하다
ex2)
func multiplyByTen(value: Int?) { //매개변수 옵셔널Int 인 함수
guard let number = value, number < 10 else { // number가 10보다 작다는 조건식
print("10 보다 크다.") // 조건식이 false(10보다 큼) 일때 실행되는 코드
return // 탈출 구문
}
print(number*10) // 조건식이 true(10보다 작음) 일때 실행되는 코드
}
multiplyByTen(value: 3) // 30
guard 는 값을 언래핑 하기 위해 옵셔널바인딩 사용
언래핑된 number 변수를 guard문 밖에 있는 코드가 사용할 수 있다!
if문을 사용하여 언래핑된 변수는 그렇게 못한다!
switch-case
각 case문 마지막에 break가 자동으로 들어 있다.
case에 실행 구문이 없으면 에러가 난다
ex1)
var value = 0
switch (value)
{
case 0:
print("zero")
case 1:
print("one")
case 2:
print("two")
case 3:
print("three")
case 4:
print("four")
default:
print("five...")
}
ex2)
let someChar: Character = "z"
switch someChar {
case "a":
print("first letter")
case "z":
print("last letter")
default:
print("other")
}
switch-case 결합하기
ex1)
var value1 = 3
var days : Int = 0
switch(value1) {
case 1,3,5,7,8,10,12:
print("31")
case 4,6,9,11:
print("30")
case 2:
print("28 or 29")
default:
print("nil")
}
ex2)
let anotherChar: Character = "a"
switch anotherChar {
case "a","A":
print("The letter A")
default:
print("Not the letter A")
}
switch-case 범위 지정 매칭
let num1 = 25
let count : String
switch num1 {
case 0...9:
count = "one"
case 10...99:
count = "two"
case 100...999:
count = "three"
default:
print("four...")
}
print("\(count) 자릿수")
switch-case 에서 where절 사용
부가적인 조건을 추가하여 값이 속하는 범위 뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사 가능
where절은 switch, catch, if, while, guard, for 등에서 사용 가능
var temperature = 60
switch temperature {
case 0...49 where temperature % 2 == 0: // 범위에 속하며 짝수일 경우 출력
print("cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("out of range or odd")
}
fallthrough
break가 자동으로 포함되어 있어 case별로 빠져 나가지 않고 아래로 계속 내려가기 위해 사용
var value2 = 3
switch value2 {
case 4:
print("4")
fallthrough // value는 3 이기에 건너뛴다
case 3:
print("3")
fallthrough // value가 3이기에 출력
case 2:
print("2")
fallthrough // 위의 fallthrough 때문에 출력
case 1:
print("1") // fallthrough 가 없어 1을 출력 후 빠져나오게 된다.
default:
print("0")
}
출처 : https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA