본문 바로가기

DEV

[iOS/Swift] 스파르타 부트캠프 본캠프 6일차!

반응형

오늘부터 이제 프로젝트 주간이 끝나고, 문법을 배우게 되었다.

 

스파르타 부트캠프 강의 사이트에 있는 강의들을 다 들어보며, 실습도 해봤다.

 

let emptyString = String()
let emptyString1 = ""

let char: Character = "A"

let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]

let alphabet: (Character, Int) = ("A", 10)

alphabet.0
alphabet.1



let tuple1: (name: String, age: Int) = ("Hello", 1)

for i in 0..<5 {
    let tupleFor: (name: String, age: Int) = ("tuple\(i)", i)
    print(tupleFor)
}

let age2 = 20

age2 > 20 ? "성인" : "성인아님"

let s = 20
let ss = 10
print(s <= ss)

print(10...UInt8.max)
print(Int.min...10)


func checkCond () -> String {
    var 조건 = "조건"
    guard 조건 == "조건임" else {
        // 조건이 false 일 때 실행되는 코드블록
        // return, break, continue, throw등 코드블록을 종료하는 구문이 필요
        return "조건"
    }
    return "조건임"
}
// 만약 위에서 조건이 false라면 아래 코드는 실행되지 않습니다.
// ealry exit (빠른 탈출)이라고도 불립니다.

// 조건이 true이면 아래의 코드를 게속 진행합니다.

checkCond()


for i in 0...10 {
    print(i)
    guard i < 5 else { break }
}

var score = 50

switch score {
case 50...:
    print("50이상")
    fallthrough
case 50:
    print("딱 50")
default:
    print("END")
}


let number = 17

if number % 2 == 0 {
    print("짝수")
} else {
    print("홀수")
}

var season = "summer"

switch season {
case "spring":
    print("Go to see flowers")
case "summer":
    print("On the beach")
    fallthrough
case "autumn":
    print("See Maple Story")
case "winter":
    print("Snowman")
default:
    print("No weather")
}

let names = ["Anna", "Alex", "Brian", "Jack"]

for name in names {
    print(name)
}


for index in 0...5 {
    // 0이상 5까지 숫자를 index에 할당하며 반복합니다.
    print(index)
}

for i in 1...10 {
    guard i < 8 else {
        print("break from guard")
        break
    }
    print(i, terminator: " ")
}

var n = 10
while n > 0 {
    print(n,terminator: " ")
    n -= 1
}

print("")
var n1 = 1
var s1 = 0
while n <= 5 {
    s1 += n
    n+=1
}
print(s1)


func introduce(name: String) -> String {
    return ("Hi I'm \(name)")
}

func plus(_ a:Int, _ b: Int) -> Int {
    return a + b
}
var plusResult = plus(3, 5)

func helloWorld() {
    print("Hello World")
}

var emptyArray: [Int] = []
var emptyArray1 = [String]()

var array = [1,2,3,4,5,6]
for index in 0 ..< array.count {
    print("Index: \(index), Array Value: \(array[index])")
}

array.append(40)
array.append(contentsOf: [41, 42, 43])
array.insert(0, at: 0)

// Set에서 제공하는 유용한 함수

var defaultSet: Set<String> = ["A", "B", "C"]

// Set에 값이 들어있는지 유무를 확인하는 contains 함수
defaultSet.contains("A") // true
defaultSet.contains("a") // false
// "A"와 "a"는 소문자와 대문자의 차이가 있기 때문에 다른값이에요!

// Set에 값을 추가하는 insert 함수
defaultSet.insert("D")
print(defaultSet) // ["A", "D", "C", "B"] : Set은 순서를 보장하지 않기때문에 계속 바뀌어서 출력됩니다.

defaultSet.insert("A")
print(defaultSet) // ["A", "D", "C", "B"] : "A"는 이미 값이 있기때문에 들어가지 않아요!

let sortedSet = defaultSet.sorted()
print("sorted \(sortedSet)")

// Set에서 값을 삭제하는 remove 함수
defaultSet.remove("A")
print(defaultSet) // ["D", "C", "B"] : A의 값을 삭제하고 3개가 남았어요!

defaultSet.remove("1")
print(defaultSet) // ["D", "C", "B"] : "1"이란 값은 없어서 아무런 변화가 없어요.

// Set에서 모든 값을 삭제하는 removeAll 함수
defaultSet.removeAll()
print(defaultSet) // [] : 모든 값을 삭제해서 빈 Set가 되었습니다.


var emptyDict: [Int: String] = [:]
var emptyDict1 = [String:String]()

// Key 값에 접근하려면 []안에 Key를 넣으면 됩니다.
var defaultDictionary = ["A": "Apple", "B": "Banana"]

print(defaultDictionary["A"]) // "A" Key가 저장하고 있는 "Apple"이 출력됩니다.
// Optional("Apple")이 출력 되는데 Optional은 다음에 배워볼게요 :)

defaultDictionary["C"] =  "Cherry"

print(defaultDictionary) // ["A": "Apple", "C": "Cherry", "B": "Banana"]
// "C"에 "Cherry"가 추가되어 출력됩니다.

defaultDictionary["A"] = "Avocado"

print(defaultDictionary["A"]) // "A" Key가 저장하고 있는 "Avocado"가 출력됩니다.
// Optional("Avocado")가 출력 되는데 Optional은 다음에 배워볼게요 :)

print(defaultDictionary) // ["A": "Avocado", "C": "Cherry", "B": "Banana"]
// 이제 "A"에는 "Apple"이 아닌 "Avocado"가 저장됩니다!


print(defaultDictionary.count)
print(defaultDictionary.isEmpty)
print(defaultDictionary.keys)
print(defaultDictionary.values)


var arrayN = [Int]()
for i in 0...10 {
    arrayN.append(i)
}
arrayN.append(15)
arrayN.append(20)
arrayN.removeFirst()
print(arrayN)

for elem in arrayN {
    if elem % 2 == 1 {
        print(elem, terminator: " ")
    }
}
print()


var set1: Set = ["1","2","3"]
set1.insert("3")
print(set1)

var isFourContain: Bool
isFourContain = set1.contains("4")
print(isFourContain)

set1.remove("1")
print(set1)


var dictionary = [String:String]()
dictionary["A"] = "Apple"
dictionary["B"] = "Banana"
print(dictionary["A"])
dictionary["A"] = "Avocado"
print(dictionary["A"])
print(dictionary.count)



//let closure: (Int, String) -> Void
//let closure2: (Int) -> Void
//let closure3: () -> Void
//let closure4: (Int) -> Int
//let closure5: (String, Int) -> Int
//let optionalClosure: ((Int) -> Int)?

let closure: (Int, String) -> Void = { intValue, stringValue in // in 키워드를 사용하여 앞에는 파라미터 이름을, 뒤에는 구현부를 작성합니다.
    print(intValue)
    print(stringValue)
}
// closure 상수의 타입은 클로저로 Int, String 타입의 파라미터가 있고 Return은 없습니다.
// 할당값은 클로저의 구현입니다.

// 파라미터의 이름을 생략하면 구현부에서 $0로 사용할 수 있습니다.
// 파라미터의 이름을 생략했기 때문에 in 키워드도 생략합니다.
let closure2: (Int) -> Void = {
    print($0)
}

let closure3: () -> Void = {
    print("Hello")
}

// 파라미터의 이름을 value라고 사용하고 Int값을 리턴합니다.
let closure4: (Int) -> Int = { value in
    return value * 2
}

let closure5: (String, Int) -> Int = {
    return $0.count + $1
}
closure5("Hello", 5)

let optionalClosure: ((Int) -> Int)? = { value in
    return value * 2
}

// 파라미터가 없을 때는 in을 사용하면 안됩니다.
let emptyParameterClosure: () -> Void = {
    print("World")
}
                                                             

// 변수에 저장한 클로저 호출
let closureIS: (Int, String) -> Void = { intValue, stringValue in
    print(intValue)
    print(stringValue)
}

closure(10, "20")

// 옵셔널 변수에 저장한 클로저 호출
let optionalClosureII: ((Int) -> Int)? = {
    return $0 * 2
}

print(optionalClosure?(10))

// 구현하고 바로 호출
// 클로저를 구현하고 바로 실행하여 결과값을 helloClosure 상수에 할당합니다.
let helloClosure = {
    return "안녕하세요! 구현하자마자 바로 실행해보겠습니다!"
}()

print(helloClosure) // 안녕하세요! 구현하자마자 바로 실행해보겠습니다!


let minusClosure: (Int, Int) -> Int = { x, y in
    return x - y
}
minusClosure(10, 8)

let minusClosureNoP: (Int, Int) -> Int = {
    return $0 - $1
}
minusClosureNoP(10, 5)

let helloCC = {
    
}


func trailingTest(key: String, closure: () -> Void) {
    print(key)
    closure()
}

trailingTest(key: "Key name", closure: { // 원래는 이렇게 만들어야 하지만 아래처럼 가능
    print("Hello")
})

trailingTest(key: "Hello") {
    print("World")
}

 

 

클로저에 대해 아직 잘 몰랐었는데, 이번에 더 자세히 알게된 것 같다.

 

그 다음에는 야구게임 프로젝트를 하였다.

야구게임

 

오늘은 프로젝트 Lv1, Lv2 기능 구현을 하였다.

//
//  BaseballGame.swift
//  baseball
//
//  Created by 정근호 on 3/10/25.
//

import Foundation

class BaseballGame {
    func start() {
        print("< 게임을 시작합니다 >")
        
        let answer = makeAnswer()

        while true {
            print("\n숫자를 입력하세요")
            
            var userAnswer = [String]()
            var strikes = 0
            var balls = 0
            
            for _ in 0..<3 {
                userAnswer.append(readLine()!)
            }
            
            
            for i in 0..<3 {
                if userAnswer[i] == answer[i] {
                    strikes += 1
                } else if userAnswer.contains(answer[i]) {
                    balls += 1
                }
            }
            
            
            if balls == 0 && strikes == 0 {
                print("Nothing")
            } else if strikes == 3 {
                print("정답입니다!")
                break
            } else if Set(userAnswer).count != 3 || !isInt(userAnswer) || userAnswer.contains("0"){
                print("올바르지 않는 입력값입니다")
            }
            else {
                print("\(strikes)스트라이크 \(balls)볼")
            }
        }
    }
    
    func isInt(_ array: [String]) -> Bool {
        for i in 0 ..< array.count {
            guard Int(array[i]) != nil else { return false }
        }
        return true
    }
    
    func makeAnswer() -> [String] {
        var answer = [String]()
        var answerList = [String]()
        var count = 3
        
        for i in 1...9 {
            answerList.append("\(i)")
        }
        
       while true {
           if count < 1 { break }
           let rand = answerList.randomElement()!
           if !answer.contains(rand) {
               answer.append(rand)
               count -= 1
           } else {
               continue
           }
        }
        print("정답: \(answer)")
        return answer
    }
}

 

일단 어떻게든 구현은 하였다.

 

하지만 

 

위 처럼 한 줄로 입력하고 싶었지만,

아직은 그렇게 못하였고, 한 글자 씩 입력받도록 구현하였다.

 

 

반응형