on
Swift 문법3(guard문, switch - case문, 함수)
Swift 문법3(guard문, switch - case문, 함수)
제어문2
guard문(조건식이 거짓이면 실행)
guard문은 표현식이 거짓(false)으로 판단될 경우 수행될 else절을 반드시 포함해야 한다.
guard문은 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는 ‘ 조기 출구(early exit) ’ 전략을 제공한다 .
var x = 10 for i in 1...10{ guard i - x < 0 else{ break //조건식이 거짓이면 break 실행 } print(i) //조건식이 참이면 print(i) 실행 } //출력 결과 1 2 3 4 5 6 7 8 9
if~let vs guard~let (optional binding)
1. if~let
func Man(age: Int, weight: Double?){ if let weight = weight{ print("나이 = \(age), 몸무게 = \(weight)") } else{ print("몸무게를 정확하게 입력해 주세요.") } } Man(age: 24, weight: 74.2) Man(age: 24, weight: nil) //출력 결과 나이 = 24, 몸무게 = 74.2 몸무게를 정확하게 입력해 주세요.
2. guard~let
guard문에서 옵셔널 변수를 언래핑하면 guard문 밖에 있는 코드에서 사용할 수 있다.
if문을 이용하여 언래핑된 변수는 if문 밖에 있는 코드에서 사용할 수 없다 .
func Man(age: Int, weight: Double?){ guard let weight = weight else{ print("몸무게를 정확하게 입력해 주세요.") return } print("나이 = \(age), 몸무게 = \(weight)") } Man(age: 24, weight: 74.2) Man(age: 24, weight: nil) //출력 결과 나이 = 24, 몸무게 = 74.2 몸무게를 정확하게 입력해 주세요.
switch-case문
Swift에서 case문 마지막에 기본적으로 break문이 기본적(자동적)으로 들어 있다 .
. case문에 기능이 없으면 error가 발생한다.(error: Invalid, the case has an empty body)
let language = "s" switch language{ case "c": print("C언어") case "j": print("JAVA언어") case "p": print("PHP언어") case "s": print("SWIFT언어") default: print("모르는/안 배운 언어입니다.") } //출력 결과 SWIFT언어
switch - case문 결합하기
여러 가지 다른 경우에 대해서 동일한 코드를 실행해야 할 경우 콤마(" , ")를 사용하여 해결할 수 있다.
let language = "Swift" switch language{ case "C", "C++", "C#", "Python": print("1학년 때 배운 \(language)언어입니다.") case "Swift", "PHP", "JAVA": print("2학년 때 배운 \(language)언어입니다.") default: print("아직 안 배운/모르는 언어입니다.") } //출력 결과 2학년 때 배운 Swift언어입니다.
switch - case문에서 범위 지정 매칭
let age = 20 switch age{ case 1..<10: print("어린이 입니다.") case 10..<20: print("10대 입니다.") case 20..<30: print("20대 입니다.") case 30..<40: print("30대 입니다.") case 40..<50: print("40대 입니다.") case 50..<60: print("50대 입니다.") default: print("60세 이상입니다.") } //출력 결과 20대 입니다.
switch - case문에서 범위 지정 매칭2
import Foundation let weight = 60.0 let height = 170.0 let bmi = weight / (height*height*0.0001) var body = "" switch bmi{ case 40...: body = "3단계 비만" case 30..<40: body = "2단계 비만" case 25..<30: body = "1단계 비만" case 18.5..<25: body = "정상" default: body = "저체중" } print("BMI:\(String(format:"%.3f", bmi)), 판정:\(body)") //출력 결과 BMI:20.761, 판정:정상
Where문
특정 패턴과 결합하여 조건을 추가할 수 있다.
for에서 where절 사용하기
for i in 1...10 where i%2 == 0{ //1~10중에서 짝수만 print(i) } //출력 결과 2 4 6 8 10
switch - case 에서 where절 사용하기
print("태어난 월과 성별(0:남성, 1:여성)을 입력해주세요") let x = readLine()!.split(separator:" ").map {Int($0)!} var m = x[0] // 월 var s = x[1] // 성별 switch m{ case 12,1,2 where s == 0: print("겨울에 태어난 남자이군요") case 12,1,2 where s == 1: print("겨울에 태어난 여자이군요") case 3...5 where s == 0: print("봄에 태어난 남자이군요") case 3...5 where s == 1: print("봄에 태어난 여자이군요") case 6...8 where s == 0: print("여름에 태어난 남자이군요") case 6...8 where s == 1: print("여름에 태어난 여자이군요") case 9...11 where s == 0: print("가을에 태어난 남자이군요") case 9...11 where s == 1: print("가을에 태어난 여자이군요") default: print("정확한 월과 성별을 입력해 주세요") } //출력 결과 태어난 월과 성별(0:남성, 1:여성)을 입력해주세요 2 0 겨울에 태어난 남자이군요
fallthrough문
Swift에서는 case문 다음에 break문을 포함할 필요가 없다.(기본적으로 내장)
case문 다음 break문을 실행하지 않고 아래로 계속 내려가게 하려면 fallthrough문을 사용하면 된다.
var x = 1 switch x{ case 1: print("1") fallthrough case 2: print("2") fallthrough case 3: print("3") fallthrough case 4: print("4") fallthrough case 5: print("5") fallthrough default: print("그외") } //출력 결과 1 2 3 4 5 그외
함수
함수
특정 작업을 수행하는 코드 블록
매개변수(parameter,인자) 와 인수(argument) 는 차이점이 있음
함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부름
func add(x: Int, y: Int) -> Int{ //매개변수(parameter) return x+y } add(x:10, y:20) //인수(argument)
메서드
특정 클래스, 구조체, 열거형 내의 함수
함수를 스위프트 클래스 내에 선언하면 메서드라 부른다.
함수를 선언하는 방법
1. 매개변수가 없는 함수 선언
func hello(){ //리턴값이 없으면 (-> void) 생략 가능 print("hello") } hello() func hello() -> String{ //리턴값이 있으면 (-> 반환값)을 작성해야 한다. return "hello" } print(hello()) //출력 결과 hello hello
2. 매개변수가 있는 함수 선언
func add(x: Int, y: Int){ //리턴값이 없으면 ( -> void ) 생략 가능 print(x+y) } add(x:10, y:20) func add(x: Int, y: Int) -> Int{ //리턴값이 있으면 ( -> 반환값 )을 작성해야 한다. return x+y } print(add(x:10, y:20)) //출력 결과 30 30
내부 매개변수(parameter name) 이름 과 외부 매개변수(argument label) 이름
first, second = 외부 매개변수
x, y = 내부 매개변수
func add( first x : Int, second y : Int) -> Int{
return x + y
}
add( first :10, second :20) //add( x :10, y :20)사용시 오류 발생
func add( x : Int, y : Int) -> Int{
return x + y
}
add( x :10, y :20)
//외부 매개변수명을 생략하면 내부 매개변수명이 외부 매개변수명까지 겸한다.
Swift에서 함수 선언 4가지 방법
1. 외부 매개변수명을 생략(내부 매개변수가 외부 매개변수명까지 겸함)
func add(x: Int, y: Int) -> Int{ return x+y } print(add(x:1, y:1))
2. 외부 매개변수명 사용
func add(first x: Int, second y: Int) -> Int{ return x+y } print(add(first:2, second:2))
3. 외부 매개변수명을 밑줄( _ )을 사용하여 생략 ( 추천 X )
func add(_ x: Int, _ y: Int) -> Int{ return x+y } print(add(3,3))
4. 첫 번째 외부 매개변수명을 밑줄( _ )을 사용하여 생략 하고, 두번 째 매개변수부터는 외부 매개변수명 사용
(Objective - C언어의 호출 방식)
func add(_ x: Int, _ y: Int) -> Int{ return x+y } print(add(3,3))
함수명이 궁금할때 : #function 리터럴
Swift 함수명
함수명(외부매개변수명:외부매개변수명...)
#function 리터럴을 사용하여 함수명을 알 수 있다.
func add(first x: Int, second y: Int) -> Int{ print(#function) //함수명 출력 return x+y } print(add(first:2, second:2)) //출력 결과 add(first:second:) //함수명 4
Swift에서 함수 선언 4가지 방법들의 함수명
func add(x: Int, y: Int) -> Int{ //함수명 = add(x:y:) return x+y } func add(first x: Int, second y: Int) -> Int{ //함수명 = add(first:second:) return x+y } func add(_ x: Int, _ y: Int) -> Int{ //함수명 = add(_:_:) return x+y } func add(_ x: Int, with y: Int) -> Int{ //함수명 = add(_:with:) return x+y }
디폴트 매개변수(아규먼트) 정의하기
argument로 전달하는 값이 없는 경우, 디폴트 매개변수 값을 사용
함수를 선언할 때 매개변수에 디폴트 값을 할당
func hello(name:String = "아무개", aMpM:String = "시간") -> String{ return ("\(name)씨 좋은 \(aMpM)입니다.") } print(hello(name:"홍길동", aMpM:"오후")) print(hello(name:"홍길동")) print(hello(aMpM:"오전")) print(hello()) //출력 결과 홍길동씨 좋은 오후입니다. 홍길동씨 좋은 시간입니다. 아무개씨 좋은 오전입니다. 아무개씨 좋은 시간입니다.
함수로부터 여러 개의 결과 반환하기
함수는 여러 결과 값들을 튜플로 감싸서 반환할 수 있음
func converter(lenght: Float) -> (yd: Float, cm: Float, m: Float){ let yd = lenght * 0.0277778 let cm = lenght * 2.54 let m = lenght * 0.0254 return (yd, cm, m) } var lenghtTuple = converter(lenght: 100) print(lenghtTuple) print(lenghtTuple.yd) print(lenghtTuple.cm) print(lenghtTuple.m) print(type(of:converter)) //converter 타입(자료형) print(type(of:lenghtTuple)) //lenghtTuple 타입(자료형) //출력 결과 (yd: 2.77778, cm: 254.0, m: 2.54) 2.77778 254.0 2.54 (Float) -> (yd: Float, cm: Float, m: Float) //converter 타입(자료형) (yd: Float, cm: Float, m: Float) //lenghtTuple 타입(자료형)
2개의 정수를 입력받아 가감제 리턴
import Foundation func sss(x: Int, y: Int) -> (sum: Int, sub: Int, mul: Int, div: Double, rest: Int){ let sum = x+y let sub = x-y let mul = x*y let div = Double(x)/Double(y) let rest = x%y return (sum, sub, mul, div, rest) } var result = sss(x:10, y:3) print(result) print(result.sum) print(result.sub) print(result.mul) print(String(format:"%.3f",result.div)) //자료형이 String형으로 변경 print(result.rest) print(type(of:sss)) print(type(of:result)) //출력 결과 (sum: 13, sub: 7, mul: 30, div: 3.3333333333333335, rest: 1) 13 7 30 3.333 1 (Int, Int) -> (sum: Int, sub: Int, mul: Int, div: Double, rest: Int) (sum: Int, sub: Int, mul: Int, div: Double, rest: Int)
가변 매개변수(variadic parameter)
함수가 가변 매개변수를 받는다는 것을 가리키기 위해서 세 개의 점(…)을 사용
func add(number: Int...) -> Int{ var sum = 0 for i in number{ sum = sum + i } return sum } print(add(number:1,2,30)) //출력 결과 33
inout매개변수:call by reference 구현
Swift는 기본적으로 call by value
Swift에서 call by reference( 함수 종료 후에도 변경된 값을 유지 )를 구현하는 방법
var myValue = 5 func doubleValue(value: inout Int) -> Int{ value = value + value return value } print(myValue) print(doubleValue(value: &myValue;)) print(myValue) //함수 종료 후에도 변경된 값을 유지 print(type(of:doubleValue)) //함수의 자료형 //출력 결과 5 10 10 (inout Int) -> Int //함수의 자료형
'iOS프로그래밍기초(21-2학기)한성현교수 강의 내용 변형 및 요약'
from http://future-ios-developer.tistory.com/39 by ccl(A) rewrite - 2021-09-25 03:26:50