반응형
오늘부터 이제 프로젝트 주간이 끝나고, 문법을 배우게 되었다.
스파르타 부트캠프 강의 사이트에 있는 강의들을 다 들어보며, 실습도 해봤다.
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
}
}
일단 어떻게든 구현은 하였다.
하지만

위 처럼 한 줄로 입력하고 싶었지만,
아직은 그렇게 못하였고, 한 글자 씩 입력받도록 구현하였다.

반응형
'DEV' 카테고리의 다른 글
| [iOS/Swift] 스파르타 야구게임 프로젝트 오류 해결 (troubleshooting) (0) | 2025.03.12 |
|---|---|
| [iOS/Swift] readLine() 한 줄로 입력받은 값 배열로 변환하기 (troubleshooting) (0) | 2025.03.11 |
| [iOS/Swift] Swift에서의 For문 (stride, filter, reduce, 범위) (0) | 2025.03.07 |
| [Git/GitHub] .gitignore 파일 Finder에서 보는 법 (0) | 2025.03.06 |
| [iOS/Swift] UITextField, UITextView 패딩(padding) 넣기 (0) | 2025.03.06 |