iOS/iOS 자료실

Swift 스터디. 4월 첫째주

Chipmunks 2018. 4. 8.
728x90

Swift 스터디. 4월 첫째주


'꼼꼼한 재은씨의 스위프트 3 기본편' 으로 공부하고 있습니다. 지금은 절판이고 최근에 Swift 4 버전으로 새로 나온 것 같습니다.


 CHAPTER 03 | 기본 문법 : 이것이 바로 스위프트

변수 및 상수

  • 변수 선언 : var + 변수명
  • 상수 선언 : let + 상수명


범위 연산자

  • 닫힌 범위 연산자 a...b
  • 반 닫힌 범위 연산자 a..<b


1
2
3
4
5
6
7
8
9
10
let a = 1
let b = 5
 
for row in a...b {
    row
}
 
for row in a..<b {
    row
}
cs

닫힌 범위 연산자는 1 2 3 4 5
반 닫힌 범위 연산자는 1 2 3 4


 CHAPTER 04 | 흐름 제어 구문 : 코드의 활용성을 높여주는 도구들

  • for~in 구문
  • while 구문
  • repeat~while 구문


1. for~in 구문

1
2
3
for 루프용상수 in 순회대상 {
    구문들...
}
cs


순회 대상으로 사용할 수 있는 타입들

  • 배열(Array)
  • 딕셔너리(Dictionary)
  • 집합(Set)
  • 범위 데이터
  • 문자열(String)

문자열(String)은 Character 타입의 데이터들이 모여 이루는 집단적 성격의 데이터
배열과 딕셔너리, 집합은 단일 데이터가 아닌 유사한 속성의 데이터 여러 개가 모여 하나의 덩어리를 이루는 집단 자료형(Collective Types) 이다.
여러 데이터를 포함하고 있다는 의미에서 컨테이너 타입이라고 불리우기도 한다.

다음과 같이 루프 상수를 생략할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
let size = 5
let padChar = "0"
var keyword = "3"
 
for _ in 1...size {
    keyword = padChar + keyword
}
 
print("\(keyword)")
 
// [ 실행 결과 ]
000003
cs


변수나 상수가 들어가야 할 자리를 언더바로 채우는 것은, 그 위치에 변수와 상수가 필요하다는 것은 알지만, 지금 나에겐 필요가 없어 생략할 것이니, 이는 오류가 아니라는 의미이다.

2. while 구문

for~in 구문은 횟수로 반복문을 돌리며, while 문은 조건으로 반복문을 돌린다.

3. repeat~while 구문

다른 언어에서 do ~ while 구문에 해당된다. while 문과 달리 일단 구문들을 실행하고 조건을 확인한다.

guard 구문

guard 구문에는 else 블록이 필수다. 표현식의 결과가 참일 때 실행되는 블록은 없다.

1
2
3
guard 조건식 또는 표현식 else {
    조건식 또는 표현식의 결과가 false일 때 실행될 코드
}
cs


guard 영어 뜻 답게, 후속 코드들이 실행되기 전에 오류가 생길 위험을 미리 확인한다는 뜻이다. 전체 구문을 조기 종료하기 위해 사용된다. 따라서 guard 구문의 else 블록에는 이후의 코드 진행을 막아주는 구문이 반드시 포함되어야 한다. return 또는 break 구문 등을 사용해야 한다.


guard 구문은 보통 함수나 메소드에서 사용하며, 이 때 return 구문이 이같은 조기 종료 처리 역할을 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
func divide(base : Int) {
    
    guard base != 0 else {
        print("연산할 수 없습니다.")
        return
    }
    
    let result = 100 / base
    print(result)
}
 
divide(base: 5// 20
divide(base: 0// 연산할 수 없습니다.
 
cs


#available 구문

OS 버전별로 구문을 나눌 때,  직접 OS 버전을 가져오는 API를 호출하여 직접 체크하는 대신, #available 구문을 사용해서 분리할 수 있다.

1
2
3
4
5
6
if #available(플랫폼이름 버전, ..., *) {
    해당 버전에서 사용할 수 있는 API 구문
else
    API를 사용할 수 없는 환경에 대한 처리
}
 
cs


플랫폼 이름과 버전 사이는 공백으로 구분한다. 인자값은 가변 인자로 정의되어 있어 입력 개수의 제한이 없다. 따라서 쉼표로만 구분하여 플랫폼 이름과 OS 버전을 계속 나열하면 된다. 버전값의 나열이 끝나면 마지막은 *로 마무리 한다.


1
2
3
4
5
if #available(IOS 9, OSX 10.10, watchOS 1*) {
    // iOS 9용 API 구문 또는 OS X 10.10용 API 구문, watchOS 1용 API 구문
else {
    // API를 사용하지 못해ㅆ을 때에 대한 실패 처리
}
cs


switch 구문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let val = 2
 
switch val {
case 1:
    print("일치한 값은 1입니다")
case 2:
    print("일치한 값은 2입니다")
case 2:
    print("일치한 값 2가 더 있습니다")
default:
    print("어느 패턴과도 일치하지 않았습니다")
}
 
// 결과
// 일치한 값은 2입니다
 
cs


Swift는 타 언어와 다르게 break를 써줄 필요가 없다.


따라서 Swift 에서는 타 언어와 다르게 Fall through을 하려고 할 시 명시를 해줘야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
let sampleChar : Character = "a"
 
switch sampleChar {
case "a":
case "A":
    print("글자는 A입니다.")
default:
    print("일치하는 글자가 없습니다.")
}
 
// Error!
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
let sampleChar : Character = "a"
 
switch sampleChar {
case "a":
    fallthrough
case "A":
    print("글자는 A입니다.")
default:
    print("일치하는 글자가 없습니다.")
}
 
// 글자는 A입니다.
 
cs


Swift 에서 switch 구문에 사용된 비교 대상은 반드시 하나의 비교 패턴과 일치해야 한다.

case 로 작성한 일치된 패턴을 찾지 못했을 경우에 반드시 default 구문을 추가해야 한다.


하나의 case 키워드 다음에 하나 이상의 비교 패턴을 연이어 작성할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
var value = 3
 
switch value {
case 01:
    print("0 또는 1입니다.")
case 23:
    print("2 또는 3입니다.")
default:
    print("default입니다.")
}
 
// 2 또는 3입니다.
 
 
cs


case 구문에서 튜플이나 특정 타입으로 캐스팅된 객체도 사용할 수 있다. 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우, 스위프트는 case 구문의 비교 패턴 전체가 일치하는 것으로 간주한다. 이 때 일치하지 않는 나머지 부분을 상수나 변수화하여 사용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
var value = (23)
 
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입니다.
cs


case 구문은 범위 연산자를 사용해, 해당 범위에 속하는 값을 매칭할 수도 있다. 범위로 비교하여 처리하는 이 방식은 대단히 효율적이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var passtime = 1957
 
switch passtime {
case 0..<60:
    print("방금 작성된 글입니다.")
case 60..<3600:
    print("조금 전 작성된 글입니다")
case 3600..<86400:
    print("얼마 전 작성된 글입니다")
default:
    print("예전에 작성된 글입니다")
}
 
// 실행 결과
// 조금 전 작성된 글입니다
cs


튜플의 경우 원소별로 범위 연산자를 이용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var value = (23)
 
switch value {
case (0..<23):
    print("범위 A에 포함되었습니다.")
case (2..<50..<3):
    print("범위 B에 포함되었습니다.")
case (2..<53..<5):
    print("범위 C에 포함되었습니다.")
default:
    print("범위 D에 포함되었습니다.")
}
 
// 실행결과
// 범위 C에 포함되었습니다.
cs


where 구문을 추가해 각 case 블록별로 보다 복잡한 패턴까지 확장하여 매칭이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
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 let (x, y):
    print("\(x)과 \(y)은 일반 좌표상에 있습니다")
}
 
// 실행결과
// 3과 -3은 x==-y 선 상에 있습니다
cs


중첩 반복문 시 구문 레이블을 사용해 break 구문 쓰기

중첩된 반복문 안에서 사용된 break 구문은 외부 반복문에는 영향을 미치지 못한다. continue 역시 마찬가지이다. 보통의 프로그래밍에서는 플래그로 외부 반복문을 빠져나오곤 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 실행 여부를 결정할 플래그
var loopFlag = true
 
// 1에서 5까지 반복
for i in 1...5 {
    // 1에서 9까지 반복
    for j in 1...9 {
        // j의 값이 3일 때 break 구문을 실행한다.
        if (j==3) {
            loopFlag = false
            break
        }
        // 구구단을 출력한다.
        print("\(i) X \(j) = \(i * j)")
    }
    
    if (loopFlag == false) {
        break
    }
}
cs


아래는 구문 레이블을 사용한 Swift 코드다.


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)")
    }
}
cs


바깥에는 outer 레이블을, 안쪽 루프에 inner 레이블을 지정해 줘, break outer 구문으로 바깥쪽 구문까지 한 번에 종료 됐다.


1
2
3
[ 실행 결과 ]
1 X 1 = 1
1 X 2 = 2
cs


'iOS > iOS 자료실' 카테고리의 다른 글

[오류] Could not insert new outlet connection 해결법  (2) 2018.08.03
Swift(iOS) 스터디. 5번째 SQLite  (0) 2018.06.03
Swift 스터디. 4번째  (0) 2018.05.19
Swift 스터디. 3번째  (0) 2018.05.19
Swift 스터디. 4월 둘째주  (0) 2018.04.15

댓글