###### tags: `study`
# 230429 불타는 토요스터디
---
#### 상의한 내용
- while let을 사용하는 방법
- 
- 배열의 enumerated() 함수를 사용하여 for 반복문을 돌리면 배열의 index와 element를 함께 뽑아낼수 있다.
- compactMap()
- 반 개방 범위 연산자
- continue
- https://docs.swift.org/swift-book/documentation/the-swift-programming-language/controlflow/#Early-Exit
- 옵셔널 바인딩
- 
- 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>