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 |
CHAPTER 04 | 흐름 제어 구문 : 코드의 활용성을 높여주는 도구들
- for~in 구문
- while 구문
- repeat~while 구문
1. for~in 구문
1 2 3 | for 루프용상수 in 순회대상 { 구문들... } | cs |
순회 대상으로 사용할 수 있는 타입들
- 배열(Array)
- 딕셔너리(Dictionary)
- 집합(Set)
- 범위 데이터
- 문자열(String)
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 구문
3. repeat~while 구문
guard 구문
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 구문
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 0, 1: print("0 또는 1입니다.") case 2, 3: 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 = (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입니다. | 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 = (2, 3) switch value { case (0..<2, 3): print("범위 A에 포함되었습니다.") case (2..<5, 0..<3): print("범위 B에 포함되었습니다.") case (2..<5, 3..<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 구문 쓰기
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 |
댓글