0%

SWIFT_꼼꼼한 재은씨 문법편


반복문(Loop) 목차

  • 주어진 조건에 따라 특정코드를 반복적으로 실행

    for 반복문

    while 반복문

    조건문

    제어전달문

For 반복문


  • 횟수에 의한 반복
  • for ~ in {...} in키워드를 사용해서 정해진 횟수만큼 주어진 코드블록을 반복해서 실행
  • 정의된 루프상수는 for ~ in구문에서만 사용
1
2
3
for <루프상수> in <순회 대상> {
<실행할 구문>
}
  • 순회대상: 순번을 가지는 집단 자료형 또는 범위 (배열, 딕셔너리, 집합, 범위데이터, 문자열)
  • 루프상수: 순회대상이 포함하고있는 개별아이템들을 차례로 넘겨받아 임의저장. 자동재선언
  • 실행구문: for루프에 의해 반복 실행될 구문의 범위
1
2
3
for row in 1...5 {
print(row)
}

구구단 만들기

1
2
3
for row in 1...9 {
print("3 * \(row) = \(row * 3)")
}

1992~2019년

1
2
3
for year in 1992...2019 {
print("\(year) 년도")
}

루프상수가 필요하지 않을 경우

  • 그위치에 변수나 상수가 필요하지만 나한텐 필요가없어
1
2
3
4
5
6
7
8
let size = 5
let one = "공"
var keyword = "칠"

for _ in 1...size {
keyword = one + keyword
}
print("\(keyword)")

결과: 공공공공공칠

다중루프 & 이중루프(구구단 예제)

  • 바깥루프는 19까지 순회 안쪽도 마찬가지로 19까지 순회
  • 바깥 루프가 순회할 때마다 루프 상수 i 에는 19까지 차례로 대입, 안쪽 루프가 순회할 때마다 j에도 19까지 차례로 대입
1
2
3
4
5
for i in 1...9 {
for j in 1...9 {
print("\(i) * \(j) = \(i * j)")
}
}

While 반복문


  • 조건에 의한 반복

while 구문

  • 주어진 조건이 false가 될 때까지 계속 반복
  • for~in 구문은 while 구문으로 쉽게 변경이 가능하지만 반대는 쉽지 않음
  • 조건을 만족하는 동안은 계속 실행
  • 반복횟수를 예측하기 어려운 조건에서 사용
  • 매번 시작할때 조건을 평가해서 루프를 돌지말지 결정
  • 처음부터 거짓이면 실행 X
  • 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
1
2
3
while <조건> {
<실행할 구문>
}
  • 조건은 반드시 True & False 결과로 반환해야한다.
  • 결과가 true인경우엔 코드가 반복해서 수행하지만 false경우 그즉시 종료되고 다음 구문을 실행하게 된다.

n을 2배씩 증가시키다 1000보다 커지는 순간 중지

1
2
3
4
5
var n = 2
while n < 1000 {
n = n * 2
}
print("n=\(n)")

무한루프

  • 조건대신 true를 넣으면 한없이 반복 실행되는 무한루프 탄생
  • 코드를 탈출할 수 있는 break 를 넣어주지 않으면 영원히 반복
  • 액션, 이벤트에 의해 동작하는 모바일 앱은 사용자의 액션을 기다리는 동안 입력 대기상태를 유지하는데, 앱이 종료되지 않은 채로 대기상테를 유지하기 위해 이벤트루프라고 불리는 무한루프를 만들어 실행한다.
1
2
3
while true {
...
}

repeat~while 구문

  • 일단 주어진 코드를 실행하고 다음에 다시 실행할지 말지를 조건을 통해 평가
  • 조건이 거짓이라도 최소 한 번은 실행
1
2
3
4
repeat {
<실행할 구문>
}
while <조건식>
  • n이 1000이 되기전까지 2를 했을때 (repeat~while, while의 값이 달라짐)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//while만 사용한경우
var n = 1024
while n < 1000 {
n = n * 2
}
print("n=\(n)")
//결과: n=1024

//repeat~while 사용한경우
var n = 1024
repeat {
n = n * 2
}
while n < 1000

print("n=\(n)")
//결과: n=2048
//조건식의 결과가 false할지라도 이미 n * 2 구문이 한번 실행된 상태
//반드시 한번은 실행할 필요가 있는 조건에 사용된다.

조건문


if 구문

  • 조건식의 평과 결과가 참(true)일때만 코드 블록 내부의 구문을 실행하고, 거짓(false)이라면 코드블록을 빠져나가 다음 코드를 수행한다.
1
2
3
if <조건식> {
<실행할 구문>
}
  • 조건문은 반드시 Bool타입의 참, 거짓을 판단할 수 있는 형태의 구문이여야 한다.
1
2
3
4
5
6
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
}

if~else

1
2
3
4
5
if <조건식> {
<조건이 참일 때 실행할 구문>
} else {
<조건이 거짓일 때 실행할 구문>
}
  • if 구문과 함께 사용되어 조건식의 결과가 참이 아닐때에만 해당 블록을 실행함.
1
2
3
4
5
6
7
8
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
} elset {
print("c는 d보다 작다")
}

if 구문의 중첩

  • if 구문은 중첩해서 사용이 가능하다.
1
2
3
4
5
6
7
8
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
} elset {
print("c는 d보다 작다")
}

if~else if

1
2
3
4
5
6
7
if <조건1> {
<조건1이 참일 때 실행할 구문>
} else if <조건2> {
<조건2이 참일 때 실행할 구문>
} else {
<앞의 조건들이 전부 만족하지 않았을 때 실행할 구문>
}
  • else if 구문은 여러번 사용이 가능하다. 비교해야 할 값이 여러개일 때 사용하기 좋다.
  • Else 구문은 앞에서 진행된 if~else if 구문들의 조건에서 어느것도 속하지 않았을 때 실행되어야 하므로 항상 맨 마지막에 위치해야 한다.

guard 구문

  • 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다.
  • if 구문과 차이는 guard구문에는 else가 필수이지만 결과가 참일 때 실행되는 블록이 없다는 점이다.
1
2
3
4
guard <조건식 또는 표현식> else {
<조건식 또는 표현식의 결과가 false일 때 실행될 코드>
return <함수의 실행을 종료하기 때문에 거의반드시 쓰임>
}
  • 코드가 실행되기 전 특정조건을 만족하는지 확인하는 용도로 사용된다.
  • guard구문의 else블록 이후엔 코드진행을 막아주는 구문이 반드시 포함되어야 하는데 return 또는 break구문이 이에 해당한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func divide(base: Int) {
guard base != 0 else { // 같음이 아닐때 참
print("연산불가")
return
}
guard base > 0 else { // (base != 0) 이 참일때 넘어옴
print("base는 0보다 커야한다.")
return
}
guard base < 100 else {
print("base는 100보다 작아야 한다.")
return
}
let result = (100/base)
print(result)
}

switch 구문

  • 입력받은 값을 조건식 여부가 아니라 패턴으로 비교하고 그 결과를 바탕으로 실행 블록을 결정하는 조건문
  • 나열된 패턴들을 순서대로 비교하다가 일치하는 첫 번째 패턴의 코드 블록을 실행한다.
1
2
3
4
5
6
7
8
switch <비교대상> {
case <pattenrn1>:
<패턴 1이 일치했을 때 실행할 구문>
case <pattern2>, pattern3>:
<패턴 2, 3이 일치했을 때 실행할 구문>
default:
<어느 비교 패턴과도 일치하지 않았을 때 실행할 구문>
}
  • 비교대상과 패턴이 일치할 경우 그에 해당하는 구문이 실행된 후 나머지 case에 대한 비교 없이 switch구문을 종료하고, swithch 구문 다음에 나오는 실행블록으로 진행한다.
  • 어느 패턴과도 일치하지 않았다면, 맨 마지막 default구문의 코드가 실행된다.
  • 일치하는 패턴이 여러개이더라도 맨 처음 일치하는 case구문 하나만 실행한다.
  • fallthrough
    • fallthrough 가 사용된 case블록은 비교패턴이 일치할 경우 인접한 case블록으로 실행흐름을 전달한다.
    • fallthrough에 의해 실행흐름을 전달받은 case블록은 비교패턴의 일치 여부와 상관 없이 작성된 구문을 실행한 후 switch구문을 종료한다.
1
2
3
4
5
6
7
8
9
10
var value = (2, 3)

switch value {
case let (x, 3):
print("튜플의 두번째 값이 3일때 첫 번째 값은 \(x)이다")
case let (3, y):
print("튜플의 첫번째 값이 3일때 두 번째 값은 \(y)이다")
case let (x, y):
print("튜플의 값은 각각 \(x), \(y)이다")
}

결과: 튜플의 두 벚째 값이 3일때 첫번째 값은 2이다

  • swich구문에서 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우 스위프트 case구문의 비교 패턴 전체가 일치하는 것으로 간주한다.
  • 일치하지 않는 나머지 부분을 상수나 변수화 하여 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
var passtime = 1957
switch passtime {
case 0..<60 :
print("방 금 작성된 글이다")
case 60..<3600 :
print("조 금 전 작성된 글이다")
case 3600..<86400 :
print("얼마 전에 작성된 글이다")
default :
print("예전에 작성된 글이다")
}
  • 범위 연산을 사용하여 해당범위에 속하는 값을 매칭한다.
1
2
3
4
5
6
7
8
9
10
11
var value1 = (2, 3)
switch value1 {
case (0..<2, 3) :
print("범위 A에 포함되었습니다.")
case (2..<5, 0..<3) :
print("범위 B에 포함되었습니다")
case (2..<5, 3..<5) :
print("범위 C에 포함되었습니다")
default :
print("범위 D에 포함되었습니다")
}
  • 튜플의 경우 아래와 같이 원소별로 범위 연산자를 이용한 범위를 사용하여 비교가 가능하다.
1
2
3
4
5
6
7
8
9
10
var point = (3, -3)

switch point {
case let (x, y) where x == y:
print("\(x)과 \(y)은 x==y 선 상에 있습니다")
case let (x, y) where x == -y:
print("\(x)과 \(y)은 x==-y 선 상에 있습니다")
case (x, y) :
print("\(x)과 \(y)은 일반 좌표상에 있습니다")
}

제어전달문


break

  • switch 구문에선실행 흐름이나 반복 실행 중인 루프를 조건식 결과에 상관없이 즉각적으로 종료하는데 사용
  • 반복문 에서는 반복 실행 블록에 사용되어 조건식이 false를 반환하기 전에 미리 반복문을 종료하는 역할을 한다.
    • 반복문내에서 실행시 반복문의 전체실행을 즉시 종료하고 마지막에 위치한 닫는 중괄호 다음의 첫 번째 코드 줄로 실행흐름을 전달한다.
  • for~in 구문에서는 남은 아이템의 순회를 더이상 진행하지 않고 반복문을 종료한다.

continue

  • 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다.
  • continue구문 이후 실행할 내용이 남았더라도 실행되지 않는것은 break와 같지만, break구문은 반복문이 완전히 종료하는 것과는 달리 continue구문은 아래에 있는 나머지를 실행하지 않을 뿐, 전체 반복은 유지된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var text = "This is a swift book for Apple's programming language"
var result1 = ""

for char in text.self {
if char == " " {
result1.append(Character("_"))
continue
} else if char == "o" {
result1.append(Character("O"))
continue
}
result1.append(char)
}
print(result1)

결과: This_is_a_swift_bOOk_fOr_Apple's_prOgramming_language

구문레이블

  • Break, continue구문이 어떤 구문을 멈추거나 다시 시작하게 할지 명확하지 않을때! 명확하게 표현해 줄 필요가 있다.
  • 반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고 Break, continue 구문이 사용될 때 레이블을 명시해 줌으로써 해당 위치에 정확히 흐름제어가 적용할 수 있도록 문법을 제공한다.
1
2
3
<레이블이름> : while <조건식> {
<실행할 구문>
}
1
2
3
4
5
6
7
8
9
10
11
12
// 1에서 5까지 반복
outer : for i in 1...5 {
// 1에서 9까지 반복
inner : for j in 1...9 {
// j 의 값이 3일 때 break 구문을 실행한다.
if (j == 3) {
break outer
}
// 구구단을 출력한다.
print("\(i) X \(j) = \(i * j)")
}
}

결과: 1 X 1 = 1, 1 X 2 = 2

  • 바깥루프, 안쪽루프에 레이블을 지정해준 다음 이를 활용해서 안쪽 루프에서 break outer를 호출하면 바깥까지 모두 종료가된다.

1. github 나를 위한 테마적용하기 ㅎ..

[테마파일 가져오고 내프로젝트에 적용시키고 변환시켜서 깃허브에 넣어줌
설치절차를 알아보고, clone으로 소스를 내려받고, generate한것을 deploy해준다.]

적용하고 싶은 테마다운로드 Themes

ghblog 폴더로 이동(cd)해서 해당 git 복붙($빼야함) -> 다운로드

git clone https://github.com/theme-next/hexo-theme-next themes/next

_config.yml 에서 이름변경하기 <- [테마]관련 설정부분

vi _config.yml [vi]으로 들어가기

vi 93번줄에서 theme: "landscape" 테마이름을 변경

hexo clean to clean Hexo’s cache. (기존 캐시파일을 날리고 재생성 하라는 의미)

hexo clean && hexo generate 입력

hexo server 확인 -> [control+C]로 닫음

hexo deploy [베포] 바뀐 테마 적용.





2. Branch

[분기점을 생성하고 독립적으로 코드를 변경할 수 있도록 도와주는 모델]

1. branch 생성, 차원이동

  1. git branch {file이름}
  2. git branch
  3. git checkout {file이름} - 해당 파일로 이동하려고함 (차원 이동)
  4. git branch - 해당파일에 *붙음을 확인 (복붙한뒤 메인을 옮긴 것)

2. vi, add, status

  1. vi README.md- vi로 열어라

  2. git status - commit해야할 목록 확인

  3. git add README.md

  4. git status - 확인: On branch earth123 Changes to be committed

3. commit

  1. git commit -m " " (commit하면서 vi없이 메세지를 붙일수있음:저장메세지/변경된내용을 상세하게 적으세요)

  2. cat README.md - 내용확인

  3. git branch





3. 병합(merge)

[브런치로 작업한 내용이 성공적일때 마스터에 돌아가서 기존 파일과 병합한다]

1. merge

  1. git checkout master 마스터로 돌아온다.

  2. git branch 현재 차원을 확인

  3. git merge {file name} 마스터에서 브런치로 작업한 내용을 merge한다.

    • 수정된 내용이 나타난다.

git diff {file name} = 현재 브런치와 {file name}의 다른점 확인 가능

2. flow init

  • git flow init 이순간부터 깃을 인용하겠다

  • git flow feature start {flow-init} 새롭게 만듬 -> 브런치 체크아웃 동시작업해줌

  • git flow feature finish {flow-init} -> 끝낼때 사용시 간단하게 commit





4. 지우기(-D)

git branch -> git branch -D {file이름} -> git branch -> cat README.md - 실험한 파일 확인









내가보기위해 만든내용.. (ㅠㅠ)

hexo is awesome.

How to create blog with hexo

1
2
3
4
5
6
7
8
$ brew install node
$ npm -v
$ sudo npm install -g hexo-cli
$ hexo
$ hexo init ghblog
$ cd ghblog
$ npm install
$ hexo new post {post-name}

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment