형 변환(as! as?로 downcasting)
- 부모인스턴스 as! 자식클래스 // downcasting 일반 타입으로 반환. // 다운캐스팅이 반드시 성공할 것이라는 확신이 있을 때
- 부모인스턴스 as? 자식클래스 // downcasting 옵셔널 타입으로 반환. 오류 가능성 있을 경우
- 성공 확신이 있으면 as! 키워드를 사용하며 강제 변환(forced conversion)
*변환이 안되면 crash
- 성공 확신이 없으면 as?를 사용하여 안전하게 변환
* 변환이 안되면 nil을 리턴하므로 옵셔널 타입으로 반환함
- 다운캐스팅은 어떤 클래스에서 다른 클래스로 변환할 때 안전한 변환을 보장할 수 없으며,
컴파일러가 유효하지 않은 변환 시도를 잡아낼 수도 있음
- 다운캐스팅에서 유효하지 않은 형 변환이 이뤄졌는데 컴파일러가 에러를 잡지 않았다면, 런타임에서 에러가 발생
ex)
let myScrollView: UIScrollView = UIScrollView() //부모 인스턴스
let myTextView = myScrollView as! UITextView //부모 인스턴스 as 자식클래스
ex)
if let classB = classA as? UITextView {
print("Type cast to UITextView succeeded")
} else {
print("Type cast to UITextView failed")
}
타입 검사(is)
if myobject is MyClass {
print("myobject는 MyClass의 인스턴스이다")
}
기본 할당 연산자
- 할당 연산자(=)는 두 개의 피연산자를 가짐
ex)
var x: Int? // 옵셔널 Int 변수를 선언함
var y = 10 // 두 번째 Int 변수를 선언하고 초기화함
x = 10 // 값을 x에 할당함, Optional(10)
x = x! + y // x + y의 결과를 x에 할당함, Optional(20)
x = y // y의 값을 x에 할당함, Optional(10)
범위 연산자
- 닫힌 범위 연산자(closed range operator)
· x...y // x에서 시작하여 y로 끝나는 범위에 포함된 숫자
- 반 열린 범위 연산자(half-open range operator)
· x..<y // x부터 시작하여 y가 포함되지 않는 모든 숫자
- One-Sided Ranges
let names = ["A", "B", "C", "D"]
for name in names[2...] { //[...2], [..<2]
print(name)
}
//차례대로 C, D - A, B, C - A, B
삼항 연산자 ?:
[조건] ? [참 표현식] : [거짓 표현식]
ex)
var x = 10
var y = 20
print("Largest number is \(x > y ? x : y)")
// Largest number is 20
Nil-Coalescing Operator (Nil합병연산자)
let defaultColor = "black"
var userDefinedColor: String? // defaults to nil
var myColor = userDefinedColor ?? defaultColor
//nil이면 defaultColor
print(myColor) //black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
print(myColor) //red
비트 NOT 연산자
ex)
var y = 3
var z = ~y
print("Result is \(z)")
-> Result is -4
00000011
↓↓↓↓↓↓↓↓ NOT
11111100
비트 AND 연산자
ex)
var x = 171
var y = 3
var z = x & y
print("Result is \(z)")
-> Result is 3
10101011 AND
00000011
↓↓↓↓↓↓↓↓
00000011
비트 OR 연산자
ex)
var x = 171
var y = 3
var z = x | y
print("Result is \(z)")
-> Result is 171
비트 XOR 연산자
ex)
var x = 171
var y = 3
var z = x ^ y
print("Result is \(z)")
-> Result is 168
비트 왼쪽 시프트 연산자
ex)
var x = 171
var z = x << 1
print("Result is \(z)")
-> Result is 342
비트 왼쪽 시프트 연산자
-> Result is 85
스위프트 for 문
for 상수명 in 컬렉션 또는 범위 {
// 실행될 코드
}
ex)
for index in 1...5 {
print("Value of index is \(index)")
}
for _ in 1...5 {
print("안녕")
}
//이렇게 for 구문 안에서 쓰이지 않는다면 _로 참조체 생략 가능
- 배열의 항목 접근
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
print(name)
}
// Anna
// Alex
// Brian
// Jack
- dictionary의 항목 접근
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
//dictionary는 key:value형식의 배열
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs
while 반복문
while 조건식 {
// 스위프트 코드가 위치함
}
repeat . . . while 반복문
repeat {
// 스위프트 코드가 위치함
} while 조건식
- do … while 반복문을 대신하는 문
- repeat … while 반복문의 몸체는 적어도 한번은 실행
guard문(조건식이 거짓이면 실행)
guard <불리언 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치
ex)
func multiplyByTen(value: Int?) {
guard let number = value, number < 10 else {
//조건식이 거짓일 때 실행
print("수가 10보다 크다.")
return
}
print(number*10)
//조건식이 참일 때 실행, 주의 : number를 여기서도 사용 가능
}
multiplyByTen(value: 3) //30
- guard문은 값을 언래핑(unwrap)하기 위해서 옵셔널 바인딩을 이용하며, 그 값이 10보다 작은지 검사한다
- if 문을 이용하여 언래핑된 변수는 if문 밖에서는 코드를 사용할 수 없지만
- 언래핑된 number 변수를 guard 문 밖에 있는 코드가 사용할 수 있다.
switch 문 사용하기
switch 표현식
{
case match1:
구문
case match2:
구문
case match3, match4:
구문
default:
구문
}
- 표현식은 값 또는 값을 반환하는 표현식을 나타낸다. 이 값은 switch 문이 작동하는 데 필요한 값이다. ㄱ
- 다른 언어들과 다르게 각 case 문 다음에 break문을 포함할 필요가 없다
- 이외의 설명들은 쉬운 표현이므로 예시로 설명을 마무리하겠다.
ex)
var value = 4
switch (value)
{
case 0:
print("zero")
case 1:
print("one")
case 2:
print("two")
case 3:
print("three")
default:
print("Integer out of range")
}
case 문 결합하기
ex)
var value = 4
switch (value)
{
case 0, 1, 2:
print("zero, one or two")
case 3:
print("three")
default:
print("Integer out of range")
}
fallthrough
- 다른 언어의 switch 구현체에서의 fallthrough 효과는 fallthrough 문을 이용하여 구현할 수 있다.
ex)
var temperature = 4
switch (temperature )
{
case 0...10:
print("cold")
fallthrough
case 10...20:
print("warm")
fallthrough
case 20...40:
print("hot")
fallthrough
default:
print("temperature out of range")
}
'iOS 프로그래밍 > 문법' 카테고리의 다른 글
[swift] 문법정리6 (옵셔널 체이닝) (0) | 2020.07.31 |
---|---|
[swift] 문법정리5 (배열, 딕셔너리,클래스와 구조체 열거형 비교) (0) | 2020.07.31 |
[swift] 문법정리4 (클래스, 상속, 익스텐션) (0) | 2020.07.31 |
[swift] 문법정리3 ( 함수와 메서드, 클로저) (0) | 2020.07.30 |
[swift] 문법 정리1 (0) | 2020.07.30 |