본문 바로가기

iOS 프로그래밍/문법

[swift] 문법 정리2

형 변환(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") 
}