오늘은 Swift의 반복문에 대해서 다뤄보겠다! :)

반복문은 말그대로 반복적으로 해당되는 코드블럭을 실행하게 만드는 구문이다.

 

Swift 의 반복문 키워드는 대표적으로 for-in, while, repeat-while 이 있다.

하나씩 살펴보도록 하자

 

1.  for - in

 

for 상수 초기식 ; 조건식 ; 변화식 { 

코드 블럭

}

에 익숙한 사람이라면 자연스럽게

이런식의 코드를 쓰겠지만, "이런 C 스타일의 구문은 siwft3에서 지워졌다." 라는 에러메세지로 알 수 있듯이,

더 이상 저런 형식의 for문은 사용할 수가 없다.

 

그 대신에 Swift 에서는 for-in 구문을 써주면 된다!

 

for - in 은 in 때문에 생소할 수 있을 수 있고, 아마 파이썬을 한 사람이면 익숙할 것이다.

어려울 것 없이 순회대상 또는 범위가 있는 코드에 써주면 된다.

구조는 다음과 같다.

 

Swift 에서는

for <값> in <순회범위> {

코드블럭

}

 

사용예제를 살펴보자

numbers 라는 배열이 있고 i 는 그 배열을 순회하며 출력한다. 

따라서 결과값은 1,2,3,4,5 차례대로 출력된다.

 

특정한 조건을 달고 싶다면 조건문 if를 넣어주어도 된다.

i는 위 코드 예제처럼 배열을 순회한다. 다만 달라진 점은 if문의 등장으로 i가 2로 나눠 나머지가 0일 때, 즉 짝수일때만 출력하라는 조건식을 써주었다. 

결과값은 당연히 배열 내의 짝수인 2,4 가 출력된다.

 

마지막 for-in 예제

이번에 in <범위대상> 을 직접 써줬다. ...의 사용으로 범위는 i >= 1 && i<=3 (1 이상 3이하) 인 [1,2,3]이 된다.

result 의 초기값은 1로 설정하고 i의 값을 루프를 돌때마다 result에 곱해준다.

결과값은 1,2,6 이 될 것이다.

 

 

 

 

2. while

while 은 

 

while 조건식 {

코드블럭

 

의 구조로, 조건식에 맞다면 해당 코드블럭을 계속 실행한다. 

예제를 들어보자

count = 0 으로 초기화 되어있고, 그 값이 50보다 작다면 계속 1씩 증가할 것이다.

count 는 0 부터 49까지 점차 값이 증가할 것이고, 49일때 까지만 조건식을 충당해 코드 블럭내로 들어가고

그 안에서 1이 더해진 다음 50이 되어 while 루프 밖을 빠져나온다.

라서 루프 밖에서 50이라는 결과값이 출력되는 것!

 

 

 

다음으로 이 코드 구문을 repeat-while 을 이용하여 써보겠다.

 

3. repeat-while

repeat - while 문은 do - while로 이해하면 된다.

 

repeat {

실행 구문

} while(조건식)

 

의 구조를 가지고 있다.

컴파일러는 repeat 내를 먼저 실행하고 while의 조건식이 맞는지 비교한다. 

결과값은 50이 출력될 것이다. (count2 가 49일때 1이 더해져 50이 되기 때문에 조건식에 맞지 않아 해당 루프를 빠져나오기 때문!)

 

 

마지막 repeat-while 예제를 살펴보겠다.

1씩 증가하는 i를 total 에 더해주는 구문이다. 다만 여기서 조건은 i 가 10 보다 작을 때 까지기 때문에 

i 는 초기값인 0 부터 9까지 증가하며 그 값을 total 에 더해준다.

결과값은 아래와 같다.

 

오늘은 이렇게 Swift 의 반복문에 대해 다뤄보았다.  다음 파트에서는 옵셔널과 옵셔널 바인딩을 해야겠다!

앞서 함수를 배웠으니 이쯤되면 등장해야하는 조건문에 대해서 알아보자

 

1. 조건문 (if, switch, guard)

- 주어진 조건에 따라 명령을 수행하는 문장, 즉 조건의 참과 거짓을 판별하여 참일 때 수행된다.

- Swift 에서의 조건문 : if, switch, guard

하나씩 사용법을 알아보도록 하자

 

(1) if

swift 의 if문은 다음과 같은 형식으로 써주면 된다.

 

예제 코드로는 홀수와 짝수 판별식을 만들어보자

 

if 문의 조건이 성립한다면 즉, 2로 나눈 나머지가 0 이라면 "짝수입니다." 를 출력할 것이고, 그렇지 않다면 (else) 다음 else 구문안의 문장을 출력할 것이다. 

따라서 num이 3일때: if 조건문 성립 X -> else 문으로 이동 후 실행

num이 6일때: if 조건문 성립 O, 실행

 

 

 

만약에 조건이 3개 이상이라면? else if 를 사용해주면 된다

myMark 

조건 1: 점수가 90 이상이면 A 

조건 2: 80-90 사이면 B

조건 3: 둘 다 아니면 C

 

위 같은 경우는 switch 문으로 하는 게 낫겠지만 좋은 예시가 생각나지 않으니 이걸로 해보자

 

if ~ else if ~ else

 

 

 

 

(2) switch

- switch 는 입력변수에 매칭되는 case 가 실행된다.

- 반복적으로 if, else - if 를 써야되는 상황이라면 switch 문으로 써주는게 가독성이 더 좋고 적합할 때가 있다. 

 

 

위에서 if 문에서 사용한 myMark를 좀 더 세부화시켜서 switch 구문으로 바꿔보자

 

myMark

조건 1: 점수가 90-100 사이면 A

조건 2: 80-90 사이면 B

조건 3: 70-80 사이면 C

조건 4: 60-70 사이면 D

조건 5: 60 미만이면 F

 

mark 가 입력변수이기 때문에 따로 조건에 맞는 case 구문을 실행한다. 사이에 있는 값은 ... 으로 표현한다

 

 

하지만 위의 if 조건절처럼 mark > 90 이런식으로 쓸 수 있을까?

바로 다음과 같은 에러가 발생한다. " Expression pattern of type 'Bool' cannot match values f type 'Int' "

위 switch 구문에서 입력변수의 데이터타입은 Int이다.

따라서 매칭되는 case 를 찾기 위해서는 case 조건부분이 같은 Int 이어야 한다는 것이다.

하지만 mark >= 90 이 부분은 참과 거짓으로 판단되는 Bool 타입이기에 다음과 같은 에러가 발생하는 것이다. 

그래서 굳이 비교등호가 필요하다면 다음과 같이 써주면되겠다.

 

 

오류 해결 - 1번 방법

 

1번 방법이다. boolean의 case 를 써야된다면, 입력 변수 값을 같은 boolean으로 변경해주면 된다.

switch를 실행시켜야 하기에 당연히 true 를 써주고, 아래 case 수식을 아까 쓰지 못한 등호를 사용하여 완성한다.

하지만 보기에도 좋은 코드는 아닌 듯하니 참고만 하자!

 

 

 

오류 해결 - 2번 방법

 

 

입력 변수 타입을 바꾸지 않겠다면 case _ where 을 추천한다.

혹시 sql 을 공부했었던 사람이면 눈치챘겠지만 where 은 뒤에 조건식을 데리고 다닌다. 그래서 데이터베이스에서 특정 데이터 값을 찾을 때 where FirstName = 'Ellie' 이런식으로 필터링해서 조건에 맞는 데이터 값을 찾는 것이다. 

이처럼 mark의 조건식(where)이 충족한다면 해당 case 는 실행될 것이다.

 

 

 

 

 

(3) guard

- guard 는 우리가 아는 뜻 그대로 무언가를 막는 것이다. 따라서

guard 문은 함수 내에서 입력값의 오류로 프로그램이 종료되는 것을 막기위해 사용해준다.

 

Q: 그렇다면 잘못된 값일 때의 처리를 어떻게 해줄까? 

A: else 구문과 함께 return , throw, break 등 으로 함수의 실행을 막거나 함수를 나가게 하면된다.

그래서 guard - else 는 항상 한 세트로 다니니 기억하도록 하자

 

guard 예시코드

input 앞에 guard 가 붙어있으므로 해당 함수는 input 이 1 일때만 실행된다.

결과에서 알 수 있듯이 1을 입력하면 함수가 실행이 됐지만, 2를 입력하니 return 되어 결과가 없는 것을 확인할 수 있다.

  

Q: 보면서 if 같다고 생각하는 사람이 많을 것이다. 둘의 차이는?

A: if와 다른점은 코드블럭의 수행을 막기위해 if는 부정의 조건식을 쓰지만, guard 는 수행에 필요한 조건을 그대로 나타내어 훨씬 가독성이 좋습니다

 

Q: 여러식의 조건문을 쓰고 싶을 때는?

A: Guard 문은 쉼표(,)로 구분하여 여러 조건을 쓸 수 있다.

 

여러식의 조건문을 쓴 간단한 예시 코드는 다음과 같다.

로그인을 하려면 아이디와 비밀번호 두 개의 필드가 입력되어야만 다음으로 진행이 가능하다.

필드값이 비어있지 않은 경우, 즉 != nil일 경우에 guard 문을 붙이고, 비어있을 경우 (else) 에는 return 을 메세지 출력과 함께 return 을 시켜주자. 

 

 guard로 사용자 아이디와 비밀번호 필드값 입력 확인하기

 

따라서 테스트한 부분을 보면 아이디와 비밀번호가 nil 일 때는 결과값으로 else 문의 코드블럭에 있던 "아이디와 비밀번호가 입력되지 않았습니다. " 가 출력이 되고,

아이디와 비밀번호에 문자열을 입력해준 후 실행하면 guard 문을 통과하여 성공적으로 "아이디와 비밀번호가 입력되었습니다. " 가 출력되는 것이다.

 

 

오늘의 조건문 끝! 사실 반복문까지 다루고 싶었지만 포스트가 너무 길어질까봐 다음장에서 하도록 하겠다!

 

 

1. Swift 함수 

- Swift 에서 함수는 func 라는 키워드를 사용

 

1-1) 반환함수 return 함수

- func 이름() -> 반환타입 {   함수 Body   } 

-매개변수(Parameter)가 없는 경우와 있는 경우를 아래의 예시로 살펴보자

return function

 

1-2) void 함수 

- func 이름() {   함수 Body   }  

-또는, func 이름() -> void {   함수 Body   }

- 반환함수에서 단순히 -> 반환타입만 빼주면 된다!

 

예시를 통해 살펴보자

void function

2. 전달인자 레이블 (Argument label) 

 이 파트를 들어가기에 앞서 매개변수(Parameter)와 전달인자(Argument)의 차이를 알아보자!

- 매개변수(Parameter) : 함수의 정의에 쓰이는 변수명

- 전달인자(Argument) : 정의된 함수를 사용 및 호출할 때 전달해주는 값 (매개변수의 실제 인풋값)

 

예시를 통해 알아보자

매개변수와 전달인자

example이라는 함수의 매개변수는 정의부분에 쓰인 num1이고, 그 함수를 호출하면서 넣어준 3 전달인자가 되겠다!

 

이제 매개변수와 전달인자의 차이를 알았으니, 전달인자 레이블에 대해서 배워보자

전달인자 레이블은 매개변수의 역할을 좀 더 명확하게 해주기위해 사용한다

가장 흔한 예시인 from과 to를 들어서 사용해보자

전달인자 레이블 from to&amp;nbsp;

emailAlert 라는 함수는 "이메일이 수신자에게 전달되었다." 라는 메세지를 반환한다.

여기에서 전달인자 레이블인 from, to 를 사용함으로써 전달인자들을 입력할 때 그들의 역할을 좀 더 명확히해줄 수 있다는 장점이 있다.

 

전달인자 레이블을 사용하지 않을 경우 -> 와일드카드 식별자(_)로 대체가 가능!

와일드카드 식별자&nbsp;

그럼 이것들은 왜 사용하는 걸까??

이 전달인자 레이블과 와일드카드 식별자 사용은 전달되는 매개변수들이 많을 때 인자들의 역할을 명확하게 하여 사용하기에 편리하며, 다음의 예시처럼 레이블명에 따라 다른 함수로 구분되기에 중복함수를 지정할 때도 굉장히 유용하다.

emailAlert 라는 함수명을 가진 함수들이 세개가 있지만 매개변수 정의 부분이 다르기 때문에 자동완성 목록을 보면 컴파일러가 세 개의 다른 함수 (중복함수)로 인식하고 있다는 것을 확인할 수 있다.

 

3. 가변 매개변수

가변 매개변수 

- 매개변수를 정의할 때 몇 개의 값을 쓸 지 모르는 경우에 사용하며 이 매개변수는 배열로 인식되어 전달된다.

- 함수 정의 시 데이터 타입 옆에 ' ... ' 을 써서 사용한다

func 함수명 ( 매개변수명 : 데이터 타입 ... ) {      함수 body      }

 

예시를 통해 알아보자

guestList 라는 함수는 guests 들을 반환한다. 하지만 우리가 몇명의 게스트들이 오는 지 몰라 매개변수를 다 정의할 수 없으니 가변매개변수를 사용하여 아래 함수 호출 부문에 여러개의 전달인자를 넣어줄 수 있는 것이다!

1. Swift 란 무엇인가?

- Swift 는 우리가 흔히 알고 있는 애플 플랫폼 (iOS, iPadOS, macOS, tvOS, watchOS)을 구축하기 위해 쓰이는 프로그래밍 언어

- 2014년 WWDC(Apple Worldwide Developers Conference)에서 발표 

- 3 charcteristics) Safe, Fast, Expressive

- 유니코드 방식의 문자열 사용으로 국제 언어를 제공, UTF-8 기반 인코딩 지원

- 메모리는 결정론적 참조 카운팅 (deterministic reference counting)  방식을 사용하여 메모리 사용량을 최소한으로 유지하여 자동으로 관리 (가비지 수집 및 오버헤드 X) 

 

2.  Swift 기본 문법 Playground 로 익히기

xcode 실행 - [File] - [New] - [Playground] - macOS 선택 - Blank - 파일 이름 및 저장 경로 지정 

Playground 초기 화면

 

3. 상수와 변수 그리고 타입추론

- 상수: 변하지 않는 값 (const)  e.g.) 메모리 총 공간 

- 변수: 변할 수 있는 값 e.g.) 메모리 사용량

 

Swift 에서 상수와 변수 그리고 타입추론

- 상수: let 이름: 데이터 타입 (=값)  e.g) let total: Int 

- 변수: var 이름:데이터 타입 (=값) e.g.) var average: Int

- 타입추론: 컴파일러가 자동적으로 데이터 타입을 추론하는 것, 변수 선언 시 데이터타입 표기가 필요없음 

                  e.g.) var someVar = "Text" // 컴파일러가 String 으로 타입추론

Swift 상수와 변수

 

4.  컬렉션 타입 - Array, Dictionary, Set

- 데이터 들의 집합

- Swift 의 컬렉션Array, Dictionary, Set 

 

1) Array

: 흔히 알고 있는 배열, 값들을 순서대로 저장하는 리스트 컬렉션이며 인덱스로 접근 가능 

다양한 선언 방법이 있지만 편한거 하나만 쓰면된다

 

e.g) 그 다양한 Array 선언 방법 예시

var array : Array<Int> = Array<Int>()

var array : [Int] = Array<Int>()

var array: Array<Int> = [Int]()

var array: [Int] = [Int]()

var array = [Int]()

var array : Array<Int> = []

var array: [Int] = []

 

1-1) Array 활용 - append, insert, remove, removeAll

Swift_Array

 

2) Dictionary

: key 와 value를 쌍으로 저장하는 컬렉션, [Key:Value] 형태로 저장된다

 

e.g) Dictionary 다양한 선언 예시들

var dictionary: Dictionary<String, Int> = Dictionary<String,Int>() // String 키 - Int 값 으로 한 쌍

var dictioanry: [String:Int] = [String:Int]()

var dictioanry: [String:Int] = [:]

var dictioanry: [String:Int]()

var dictioanry: [String:Int] = ["A":1, "B":2, "C:"3] // 선언과 초기화

 

2-1) Dictionary 활용 - 키와 값 넣기, 값 변경하기, remove

Swift_Dictionary

 

 

3) Set

: 같은 데이터타입의 값을 저장하지만, 순서는 상관없이 저장됨

e.g) Set 선언 방법 예시 

var set: Set = Set<Int>()

var set: Set<Int> = [1,2,3,4,5] // 선언과 초기화

 

3-1) Set 활용 - insert, remove 

* 인덱스의 개념이 없기에 값으로 접근하고 지운다 * 

Swift_Set

 

+ Recent posts