맛동산이

스위프트 스터디 4탄) 제어문(Control Flow) 본문

앱/Swift 문법

스위프트 스터디 4탄) 제어문(Control Flow)

진ddang 2023. 7. 8. 16:14

 

스위프트 공식문서를 참조하였습니다.



For - In Loops (for in 문)

for in 문은 배열, 숫자, 문자열을 순서대로 순회 하기 위해서 사용한다.

보통 배열이나 사전을 순회하기 위해서 사용한다.

사전의 경우에는 정렬이 되어있지 않는 이상 순서대로 순회하지는 않는다. 그렇기 때문에 변수 자리에

_

를 사용해서 성능을 높일수도 있다. 또한 범위연산자와 함께 사용할 수 있다.

let names = ["Anna", "Alex", "Brian", "Jack"] for name in names {     print("Hello, \(name)!") } // Hello, Anna! // Hello, Alex! // Hello, Brian! // Hello, Jack!

 

  • stride를 사용할수 있다.

stride(form:to:by:) 이다.

from = 시작점, to = 끝나는 지점, by = 변경폭 이다.

이때 to는 끝나는지점을 포함하지 않기 때문에 포함하고 싶다면 through를 사용하면 된다.

stride(from: 5, to: 30, by: 5).forEach() { (element) in      print(element)  } // 5 // 10  // 15 // 20 // 25

 

While 문 (While Loops)

스위프트에서는 while과 repeat-while 이렇게 두개가 존재한다고 한다.

while은 일반적인 while과 동일하고 repeat-while은 do-while과 동일하게 repeat의 위치의 구문을 한번 한다음 while을 계속해서 작동한다.

repeat-while

repeat {     // move up or down for a snake or ladder     square += board[square]     // roll the dice     diceRoll += 1     if diceRoll == 7 { diceRoll = 1 }     // move by the rolled amount     square += diceRoll } while square < finalSquare print("Game over!")

 

조건적 구문(Conditional Statements)

스위프트도 if 와 switch문을 제공한다.

if문은 if, else, else if문을 사용하며, switch는 동일하게 case로 나눈다.

 

암시적인 진행을 사용하지 않는다.

스위프트에서는 objective-c와 다르게 switch에서 암시적인 진행을 하지 않는다. 즉 case에서 만족되면, 더이상 진행하지 않고 switch문을 나와버린다. 의도되지 않는 case문까지 돌아가지 않는다는 말이다. 이전에 objective-c 에서는 break를 명시적으로 작성해야 했지만, swift에서는 그렇게 할 필요는 없다. 하지만 case안에서 의도적으로 특정 지점에서 멈추게 하기 위해서는 break를 사용할수도 있다.

 

  • case문에서는 반드시 실행 구문이 있어야 한다.
  • 콤마( , )를 통해서 복수의 case조건을 합칠 수 있다.
let anotherCharacter: Character = "a" switch anotherCharacter { case "a", "A":     print("The letter A") default:     print("Not the letter A") } // Prints "The letter A"

 

  • switch case문에서 숫자의 범위를 조건으로도 사용가능하다.
let approximateCount = 62 let countedThings = "moons orbiting Saturn" let naturalCount: String switch approximateCount { case 0:     naturalCount = "no" case 1..<5:     naturalCount = "a few" case 5..<12:     naturalCount = "several" case 12..<100:     naturalCount = "dozens of" case 100..<1000:     naturalCount = "hundreds of" default:     naturalCount = "many" } print("There are \(naturalCount) \(countedThings).") // Prints "There are dozens of moons orbiting Saturn."

 

튜블(Tuple)

나는 튜플을 공부하다 보니 배열이랑 차이점을 모르겟어서 이것부터 정리하고자 한다.


집합(set)과 튜플(tuple)과 리스트(list)의 차이

셋의 경우에는 c++에서도 제공하고 있으므로, 그냥 특징정도로 정리하고자 했지만, 튜플의 경우에는 c++에 없는 개념이라 생소했다. 따라서 리스트와 뭐가 다른지 몰랐는데, 알아보니 다음과 같은 특징으로 인한 차이가 있었다.

 

집합(set)

셋의 경우에는 중복되는 데이터를 허용하지 않는다.

또한 순서도 일정하지 않기 때문에 순서가 무관하고, 빠른 검색을 할 필요가 있는경우, 그리고 중복데이터를 허용하지 않는 경우에 사용하게 된다.

 

리스트

리스트는 우리가 흔히 아는 배열이다. 순서가 있으며, 인덱스를 통해서 접근이 가능하고, 무제한 추가가 가능하다.

 

튜플

튜플의 경우가 가장 중요한데, 튜플은 c++로 예시를 들자면, 구조체랑 비슷하다고 생각한다.

최초에 튜플을 선언하게 될때, 리스트나, 셋과는 다르게 하나의 타입만을 저장하는 것이 아닌, 다양한 타입을 저장할수 있다. 또한 리스트와 다르게 계속해서 값을 추가하거나, 삭제하는것이 불가능하며, 최초에 선언된 튜플의 선언 그대로 사용해야 한다. 즉 상수적 성격을 지니고 있다.

 

👉
즉 튜플의 경우에는 최초 선언된 크기만큼만 사용하며, 다양한 자료형을 담을수 있다. (정말 구조체랑 비슷하다고 생각함)

더더욱 놀라운것은 튜플의 형태인데, 튜플의 경우에는 다음과 같이 사용하게 된다.

 

var tuple:(Int, String, Int) = (100,"hi", 101)

이렇게 선언되어 있을경우, 해당 값에 접근하기 위해서는 인덱스 넘버를 사용할수 있다.

tuple.0 // 100 tuple.1 // hi tuple.2 101

그런데 이렇게하면 헷갈리니 딕셔너리처럼 이름을 달아줄수도 있다.

var tuple =(age:101, word:"hi", number:101) tuple.age // 101 tuple.word // hi tuple.number // 101

이렇게 접근이 가능하게 된다.

튜플의 경우에도 let과 var 두타입의 변수로 지정이 가능한데

let의 경우에는 튜플 내부의 값도 변경이 불가능하지만, var로 선언하게 되면 당연히 안의 값을 변경할수 있다.


튜플 조건

Switch case문에서 튜플 자체를 조건을 사용가능하다.

이때 특정 변수를 값 바인딩을 통해서 case로 사용도 가능한데 당연히 튜플도 사용 가능하다.

let anotherpoint=(2,0) switch anotherPoin { 	case (let x, 0): 		print("x=\(x)") 	case(0, let y): 		print("y=\(y)") } // x=2

 

where문

case에서 where조건을 걸어서 사용도 가능하다.

let anotherPoint = (1,2) switch anotherPoint { 	case let(x,y) where x==y 		print(~~~~~) 	case let(x,y) where x>y 		print(jdfkafjf) 	case let(x,y) where x<y 		print("\(x), \(y) is the point x is samll") } // 1,2 is the point x is samll

 

coninue문

동일하다. 현재 loop중지하고 다음 loop가 실행됨.

break문

그냥 중지됨.

 

fallthrought 문

앞서 언급했지만, 스위프트에서는 만족하는 case를 만나게 되면, 암시적인 진행을 허용하지 않기 때문에 다음 case로 들어가지 않고 break문이 없더라도 switch 문을 탈출하게 된다. 하지만 이때 fallthrought를 사용하게 되면, 자동으로 break가 되는것이 아닌, 만족된 case 다음 case를 조건을 확인하지 않고, 실행하게 된다.

let integerToDescribe = 5 var description = "The number \(integerToDescribe) is" switch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19:     description += " a prime number, and also"     fallthrough default:     description += " an integer." } print(description) // Prints "The number 5 is a prime number, and also an integer."

 

레이블 구문(Labeled Statements)

for 문이나 while문과 같은 조건문을 레이블링을 통해서 컨트롤 할수 있게된다.

단순하게 말하자면, 다양한 중첩 반복문에서 break나 continue와 같은 탈출문을 사용했을때, 보통은 바로 반복문을 탈출하거나, 다음 루프를 돌게 되지만, 레이블을 이용하면 해당 레이블 구문으로 바로 이동하게 된다.

이러한 방식으로 반복문의 흐름을 제어할수 있게 된다.

레이블(이름): 반복문 조건 { 실행 } gotoTop: for i in 1..3 { 	print("hellow")}  gotoTop: for i in 1..9 { 	 for j in 1..6{ 			if i==5 				{ 					break gotoTop  				}}}

이렇게 되면 j가 1부터 6까지 계속해서 넘어가다가, 그 횟수가 5번째가 됐을때, 다시 gotoTop으로 이동하게 된다.

 

이른 탈출 (Early Exit)

guard 문을 통해서 특정 조건을 만족하지 않으면 해당 코드 이후가 실행되지 않도록 작성할수 있다.

func greet(person: [String: String]) {     guard let name = person["name"] else {         return     }      print("Hello \(name)!")      guard let location = person["location"] else {         print("I hope the weather is nice near you.")         return     }      print("I hope the weather is nice in \(location).") }  greet(person: ["name": "John"]) // Prints "Hello John!" // Prints "I hope the weather is nice near you." greet(person: ["name": "Jane", "location": "Cupertino"]) // Prints "Hello Jane!" // Prints "I hope the weather is nice in Cupertino."

 


Uploaded by

N2T
반응형