-
기본 할당 연산자
ㄴ 할당 연산자(=)는 두 개의 피연산자를 가짐
var x: Float? // 옵셔널 Float 변수를 선언함 var y: Float? y = 10 x = 12.5 // 값을 x에 할당함, Optional(12.5) x = x! + y! // x + y의 결과를 x에 할당함, 연산은 같은 형끼리 가능 print(x) //Optional(22.5) x = y // y의 값을 x에 할당함 print(x) //Optional(10.0)
- 옵셔널 사용이유
- 옵셔널 타입만이 값을 갖지 않는다는 의미의 nil 값을 가질 수 있음
var ho = nil // error var ho : Int? = nil // OK var ho : Int? // OK, 위와 같은 코드 옵셔널 변수는 초기화하지 않으면 자동으로 nil로 초기화 var sh : String = nil // 유효하지 않은 코드 let myConstant = nil // 유효하지 않은 코드
- 옵셔널 사용이유
- 범위 연산자
- 닫힌 범위 연산자(closed range operator)
- ㄴ x에서 시작하여 y로 끝나는 범위에 포함된 숫자
let words = ["a","b","c","d"] for word in words[1...]{ //[...1] = a b [..<2] = a print(word) //b c d }
- 닫힌 범위 연산자(closed range operator)
- Nil-Coalescing Operator (Nil합병연산자) ??
- 옵셔널변수 ?? nil일 때 할당되는 값
let defaultAge = 2 var age : Int? age = 3 print(age) //Optiona(3) var myAge = age ?? defaultAge print(myAge) //3
- 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
let defaultAge = 2 var age : Int? //age = 3 print(age) //nil var myAge = age ?? defaultAge print(myAge) //2
let defaultword = "Hi" var userDefinedword: String? // defaults to nil var myWord = userDefinedword ?? defaultword //nil이므로 defaultword인 HI 할당 print(myWord) //Hi userDefinedword = "Hello" myWord = userDefinedword ?? defaultword //nil이 아니므로 원래 값인 Hello가 할당됨 print(myWord) //Hello, 주의 optional(Hello)가 아님
- For-in 반복문
-
컬렉션 또는 숫자 범위 내에 있는 목록을 반복
for _ in 1...5 { //_ 로 참조체(i) 생략 가능 print("현호") //현호 현호 현호 현호 현호 } for i in 1...5 { print("\(i) 현호") // 1 현호 2 현호 3현호 4현호 5현호 }
-
반복문 탈출 (break)
for i in 1..<10 { if (i > 6) { //중괄호 필수 사항 괄호는 안하는 추세 break } print(i) //1 2 3 4 5 6 }
-
-
배열의 항목 접근
let color = ["red","blur","yellow","green"] for i in color { print(i) //red blur yellow green }
- dictionary의 항목 접근
- dictionary는 key:value형식의 배열
let itword = ["C": 1, "C++": 2, "C#": 3] // 숫자가 높은 순으로 출력된다 for (itname, level) in itword { print("\(itname)언어 레벨은 \(level) 입니다") //C#언어 레벨은 3 입니다 } //C++언어 레벨은 2 입니다 //C언어 레벨은 1 입니다
- 타입 검사(is)
- is 키워드를 이용하여 값의 타입 검사(type check)
class H {} var h : H = H() if h is H{ //지정된 객체가 H 라는 클래스의 인스턴스인지 검사 print("Hello") //Hello h는 H의 인스턴스이다 }
- While 반복문
- 어떠한 조건이 되기 전에 대체 몇 번 정도 반복해야 할지를 알 수는 없지만 그 조건을 만족할 때까지는 반복해야 하는 경우 while 반복문 사용
var myCount = 0 while myCount < 1000 { myCount+=1 //999까지 하고 +1 } print(myCount) //1000
- repeat-while 반복문
- do … while 반복문을 대신하는 문
- repeat … while 반복문의 몸체는 적어도 한번은 실행
var i = 10 repeat { i=i-1 print(i) //9876543210 } while (i > 0)
- Continue문
- 반복문에서 continue문 이후의 모든 코드를 건너뛰고 반복문의 상단 시작 위치로 돌아감
for i in 1...10 { if i % 2 == 0 { continue } print(i) //1 3 5 7 9 }
for i in 1...10 { if i % 2 != 0 { continue } print(i) //2 4 6 8 10 }
- IF문
-
Swift 언어는 if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용해야 한다.
var x = "안녕" if x == "안녕" { print("반가워") }else{ print("누구세요") }
var num = 3 if (num == 1 || num == 3){ print("당신은 남성이군요!\n") }else if (num == 2 || num == 4){ print("당신은 여성이군요!\n") }else { print("당신은 대한민국 사람이 아니군요!\n") // 당신은 남성이군요! }
-
- Guard문(조건식이 거짓이면 실행)
- Guard문은 표현식이 거짓(false)으로 판단될 경우에 수행될 else 절을 반드시 포함해야 함
- Guard문은 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는 ‘조기 출구(early exit)’ 전략을 제공
func multiplyByTen(value: Int?) { guard let number = value, number > 40 else { //조건식이 거짓일 때 실행 number 가 40보다 작으므로 실행 print("수가 40보다 크다.") return } print(number*10) //조건식이 참일 때 실행, 주의 : number를 여기서도 사용 가능 } multiplyByTen(value: 3) //수가 40보다 크다.
func printName (firstName:String, lastName:String?){ // if let if let lName = lastName{ print(lName,firstName) } else{ print("성이 무엇인가요?") //nil 일 때 출력 } // guard let guard let lName = lastName else{ print("성이 무엇인가요?") //nil 일 때 출력 return //nil 일 때 종료 지점 } print(lName,firstName) } printName(firstName:"현호", lastName:"신") //신 현호 신 현호 //lastName:nil = 성이 무엇인가요? 성이 무엇인가요?
- Switch - case 문
- 각 case문 마지막에 break가 자동으로 들어 있음
let grade: Character = "A" switch grade { case "A": print("Perfect") // 프린트 되는 케이스가 하나도없으면 안된다. case "B": print("That's a shame") default: print("cheer up bro") } //Perfect
-
Switch - case 문 결합
var value = 3 var days : Int = 0 switch(value) { 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("월을 잘못 입력하셨습니다.") } //31일 입니다.
-
Switch - case 문 범위 지정 매칭
let num = 95 let grade : String switch num { case 0...50: grade = "F입니다" case 51...60: grade = "E입니다" case 61...70: grade = "D입니다" case 71...80: grade = "C입니다" case 81...90: grade = "B입니다" case 91...100: grade = "A입니다" default: grade = "낙제입니다" } print("\(grade).") // A입니다.
- Switch - case 문 where절 사용
var temperature = 36 switch (temperature) { case 0...20 where temperature % 2 == 0: //홀수 짝수 검사 print("저체온증 입니다") case 21...37 where temperature % 2 == 0: print("평균 체온 입니다") case 38...50 where temperature % 2 == 0: print("고열 입니다") default: print("사망하셨습니다.") //홀수면 나오는 값 } //평균 체온입니다.
- Fallthrough (case 일치해도 계속 진행)
- case문 다음에 break 문을 포함할 필요가 없다
- case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 Fallthrough 문을 사용한다
let grade : Character = "A" switch (grade) { case "A": print("Perfect") fallthrough case "B": print("That's a shame") fallthrough default: print("cheer up bro") } //Perfect That's a shame cheer up bro
- 학습
- where 절이 들어간 for/switch 문
let howords: [(Int, Int)] = [(1, 2), (1, -1), (1, 0), (0, 2)] for howord in howords { switch howord { case let (x, y) where x == y: print("x = y") // x = 1 case let (x, y) where x == -y: print("x = -y") // x = -y case (let x, let y) where x > y: print("x > y") // x > y case (1, _): print("x = 1") case (_, 2): print("y = 2") // y = 2 default: print("숫자를 조건에 맞게 다시 넣어주세요.") } }