###### tags: `study` # 230429 불타는 토요스터디 --- #### 상의한 내용 - while let을 사용하는 방법 - ![](https://i.imgur.com/VHKokzk.png) - 배열의 enumerated() 함수를 사용하여 for 반복문을 돌리면 배열의 index와 element를 함께 뽑아낼수 있다. - compactMap() - 반 개방 범위 연산자 - continue - https://docs.swift.org/swift-book/documentation/the-swift-programming-language/controlflow/#Early-Exit - 옵셔널 바인딩 - ![](https://i.imgur.com/MttpCaB.png) - https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/#Optional-Binding - if let - guard let - while let - switch - compactMap - nil 병합 연산자 --- ### 새롭게 알게 된 것 - [~=](https://developer.apple.com/documentation/swift/closedrange/~=(_:_:)) --- #### 각자의 코드 - Dasan 🍟 <details close> <summary>[STEP1]</summary> ```swift //compactMap let products = productsList.compactMap{ $0 } for index in 0..<products.count { print("\(index)번 상품은 \(products[index]) 입니다.") } //compactMap & enumerated() let products = productsList.compactMap{ $0 } for (index, product) in products.enumerated() { print("\(index)번 상품은 \(product) 입니다.") } //if let for (index, product) in productsList.enumerated() { if let product = product { print("\(index)번 상품은 \(product) 입니다.") } else { print("\(index)번은 상품이 없습니다.") continue } } //guard let for (index, product) in productsList.enumerated() { guard let product = product else { print("\(index)번은 상품이 없습니다.") continue } print("\(index)번 상품은 \(product) 입니다.") } //nil coalescing for (index, product) in productsList.enumerated() { //let test = product ?? "" print("\(index)번 상품은 \(product ?? "") 입니다.") } //while let - 연결리스트 구현할 때 주로 쓰임. var index = 0 while index < productsList.count, let product = productsList[index] { print("\(index)번 상품은 \(product) 입니다.") index += 1 } //while let2 var index = 0 while let goods = productsList[index] { print(goods) index += 1 if index == productsList.count { break } } ``` </details> <details close> <summary>[STEP2]</summary> ```swift let price: Int = 900 var budget: Int = 3000 var productsList: [String?] = ["볼펜", "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] func printProduct() { for (index, product) in productsList.enumerated() { guard let product = product else { print("\(index)번 상품은 품절되었습니다.") continue } print("\(index)번 상품은 \(product) 입니다.") } } func buy(productNumber: Int) { if budget >= price { if let product = productsList[productNumber] { print("\(productNumber)번 \(product)가 구매되었습니다.") productsList[productNumber] = nil budget -= price } else { print("\(productNumber)번 상품은 품절되었습니다.") } } else { print("잔액이 부족합니다.") print("현재잔액: \(budget)") } } buy(productNumber: 1) buy(productNumber: 1) buy(productNumber: 2) buy(productNumber: 3) buy(productNumber: 0) buy(productNumber: 5) //printProduct() ``` </details> - Moon 🌙 <details close> <summary>[STEP1]</summary> ```swift var productsList: [String?] = ["볼펜", "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] // if let for (index, product) in productsList.enumerated() { if let product { print("\(index)번 상품은 \(product)입니다.") } } // guard let for (index, product) in productsList.enumerated() { guard let product else { continue } print("\(index)번 상품은 \(product)입니다.") } // compactMap let unwrappedProductsList = productsList.compactMap { $0 } for (index, product) in unwrappedProductsList.enumerated() { print("\(index)번 상품은 \(product)입니다.") } // ??? while let을 시도했으나 for문 안에 사용하게 되어 의미가 없지 않나 for (index, product) in productsList.enumerated() { while let unwrappedProduct = product { print("\(index)번 상품은 \(unwrappedProduct)입니다.") break } } // !!! while let Gundy가 알려주신 방법 var index = 0 while index < productsList.count, let goods = productsList[index] { print("\(index)번 상품은 \(goods)입니다.") index += 1 } while let goods = productsList[index] { print("\(index)번 상품은 \(goods)입니다.") index += 1 if index == productsList.count { break } } ``` </details> <details close> <summary>[STEP2]</summary> ```swift let price: Int = 1000 var budget: Int = 2000 var productsList: [String?] = ["볼펜", "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] func buy(productNumber: Int) -> () { guard let product = productsList[productNumber] else { print("\(productNumber)번 상품은 품절입니다.\n") return } productsList[productNumber] = nil budget -= price print(""" \(productNumber)번 상품 \(product)를 구매하였습니다. 잔액이 \(budget)원입니다.\n """) return } func showProductsList() { for (index, product) in productsList.enumerated() { if let product { print("\(index)번 상품은 \(product)입니다.") } else { print("\(index)번 상품은 품절입니다.") } } print() } while budget >= price { showProductsList() print("구매할 상품 번호를 입력해 주세요 : ", terminator: "") guard let inputProductNumber = readLine(), let inputProductNumber = Int(inputProductNumber), 0...5 ~= inputProductNumber else { print("잘못된 입력입니다.") continue } buy(productNumber: inputProductNumber) } ``` </details> - Kobe 🏀 <details open> <summary>실험1</summary> ```swift func introduceProducts(input products: [String?]) { guard let firstProduct = products[0] else { return } guard let secondProduct = products[1] else { return } guard let thirdProduct = products[2] else { return } guard let fourthProduct = products[3] else { return } guard let fifthProduct = products[4] else { return } guard let sixthProduct = products[5] else { return } print("1번 상품은 \(secondProduct)입니다.", "2번 상품은 \(thirdProduct)입니다.", "3번 상품은 \(fourthProduct)입니다.", "4번 상품은 \(fifthProduct)입니다.", "5번 상품은 \(sixthProduct)입니다.", separator: "\n") } ``` </details> <details close> <summary>실험2</summary> ```swift var budget: Int = 2000 let salePrice: Int = 1000 var penStock: Int = 1 var tumblerStock: Int = 1 var diaryStock: Int = 1 var mugStock: Int = 1 var ecoBagStock: Int = 1 var hoodyStock: Int = 1 var productsList: [String?] = ["볼펜", "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] func buy(productNumber: Int) { if productNumber == 0 { productsList[0] = nil penStock -= 1 budget -= salePrice } else if productNumber == 1 { productsList[1] = nil tumblerStock -= 1 budget -= salePrice } else if productNumber == 2 { productsList[2] = nil diaryStock -= 1 budget -= salePrice } else if productNumber == 3 { guard ecoBagStock == 1 else { print("에코백은 품절되었습니다") return } guard budget >= salePrice else { print("예산을 초과하였습니다.") return } print("에코백을 구매하셨습니다.") productsList[3] = nil ecoBagStock -= 1 budget -= salePrice } else if productNumber == 4 { guard mugStock == 1 else { print("머그컵은 품절되었습니다") return } guard budget >= salePrice else { print("예산을 초과하였습니다.") return } print("머그컵을 구매하셨습니다.") productsList[4] = nil mugStock -= 1 budget -= salePrice } else if productNumber == 5 { guard hoodyStock == 1 else { print("후드집업은 품절되었습니다") return } guard budget >= salePrice else { print("예산을 초과하였습니다.") return } print("후드집업을 구매하셨습니다.") productsList[5] = nil hoodyStock -= 1 budget -= salePrice } else { print("존재하지 않는 상품입니다.") } } ``` </details> - Whales 🐋 <details open> <summary>실험1</summary> ```swift var productsList: [String?] = [nil, "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] // For 문 조건 수정 // Binding - if let func usingIf() { for indexNumber in 0...productsList.count - 1 { if let goods: String = productsList[indexNumber] { print("\(indexNumber)번 상품은 \(goods)입니다.") } } } // usingIf() // Binding - guard let func usingGuard() { for indexNumber in 0...productsList.count - 1 { guard let goods: String = productsList[indexNumber] else { print("\(indexNumber)번 상품은 상품이 없습니다.") continue } print("\(indexNumber)번 상품은 \(goods)입니다.") } } usingGuard() // Binding - switch func usingSwitch() { for indexNumber in 0...productsList.count - 1 { let goodsName: String? = productsList[indexNumber] switch goodsName { case .none: print("상품이 없습니다.") case .some(let goods): print("\(indexNumber)번 상품은 \(goods)입니다.") } } } // Binding - while let func usingWhile() { var index = 0 while index < productsList.count, let goods = productsList[index] { print(goods) index += 1 } // var index = 0 // // while let goods = productsList[index] { // print(goods) // index += 1 // if index == productsList.count { break } // } } // nil Coalescing Operator(nil 병합 연산자) func usingNilCoalescingOperator() { for indexNumber in 0...productsList.count - 1 { let goods: String = productsList[indexNumber] ?? "no 상품" print("\(indexNumber)번 상품은 \(goods)입니다.") } } //usingNilCoalescingOperator() ``` </details> <details open> <summary>실험2</summary> ```swift var budget: Int = 2000 var productsList: [String?] = ["볼펜", "텀블러", "다이어리", "에코백", "머그컵", "후드집업"] func buy(productNumber: Int) { if productNumber >= 0 && productNumber < productsList.count && productsList[productNumber] != nil { guard let goods: String = productsList[productNumber], budget >= 1000 else { print("잔액이 부족합니다.") return } productsList[productNumber] = nil // 요소가 삭제되면 안된다. budget -= 1000 print("\(goods)을(를) 구매하셨습니다.") } else { print("상품이 존재하지 않거나 품절된 상품입니다.") } } buy(productNumber: 3) buy(productNumber: 7) buy(productNumber: 5) buy(productNumber: 2) // 에러처리 enum BuyError: Error { case NoProductsError case overBudgetError } func buy(productNumber: Int) throws { if productNumber >= 0 && productNumber < productsList.count && productsList[productNumber] != nil { guard let goods: String = productsList[productNumber], budget >= 1000 else { throw BuyError.overBudgetError } productsList[productNumber] = nil // 요소가 삭제되면 안된다. budget -= 1000 print("\(goods)을(를) 구매하셨습니다.") } else { throw BuyError.NoProductsError } } func order(productNumber: Int) throws { do { try buy(productNumber: productNumber) } catch BuyError.overBudgetError { print("잔액이 부족합니다.") } catch BuyError.NoProductsError { print("상품이 존재하지 않거나 품절된 상품입니다.") } } try order(productNumber: 3) try order(productNumber: 7) try order(productNumber: 4) try order(productNumber: 1) ``` </details>