μλ νμΈμ! μ€λμ μ΄μ μ μΆνλ μ«μ κ²μμ λν νΌλλ°±μ κ°μ Έμμ΅λλ€. ( μ¬μ€ νλ² λ λ €λ¨Ήμ μνλΌ λ©νμ΄ λλλλμ΄μμ€..γ κ·Έλλ λ μ΄λ‘ν΄ λ€μ μμ±ν΄μΌμ£ ..γ )
μ .. μΉμ°¬λ°μμ΄μ!!!γ γ γ γ γ
μ¬μ€ μ΄μ νμ₯μ λν κ°λ μ 곡λΆνλ μ€ νμ₯μ λ°μ΄ν° ꡬ쑰μ λν΄μ μ΄ν΄κ° μλλ λΆλΆμ΄ μλλΌκ΅¬μ. κ·Έλμ μ£Όλ³μ λμμ μμ²νλλ°, μκ³ λ³΄λ μ κ° νμ₯μ λ°μ΄ν° ꡬ쑰λ₯Ό μμ μ²μλΆν° μ΄ν΄λ₯Ό μ λͺ»νκ±°λλΌκ΅¬μ.. (μ¬μ€ μμ§ ν΄κ²° λͺ»ν¨.. μμ§λ μ΄ν΄ λͺ» νλμ€.. ) κ·Έλμ μμ£Ό λλ΄νλ©° μ°μΈν΄νκ³ μμλλ° μ΄λ° λ¨λΉκ°μ μΉμ°¬μ΄....πΈ
νΉν μ»€λ° λ΄μ μ λλμ΄μ λ¨κ²¨μ£Όμ μ νλ¦ λ°λΌκ°κΈ° λ§€μ° μ©μ΄νμ΅λλ€.
...
λ§€μ° μνμ ¨μ΅λλ€!
...
μ»€λ° λ΄μμ κ°λμ΄μμ γ
μ κ° λ κ°λμ λλ€.. νν ¨λ..π©΅
μ΄μ νΌλλ°±μ λ°μμΌλ νλνλ λ―μ΄λ΄μΌμ£ !
첫 λ²μ§Έ, " RecordManagerμ μμ£Ό μ μμ±νμ ¨μ΅λλ€! "
TableView μ κ΄ν μ± κ°μλ₯Ό λ€μΌλ©΄μ ν
μ΄λΈ λ·°λ₯Ό λ°λΌν΄λ³Όλ, TableViewManager
λ₯Ό μΌλ κΈ°μ΅μ΄ λλλΌκ΅¬μ. κ·Έλμ κ²μ κΈ°λ‘μ 보κ΄νκ³ μλ RecordManager
κ° λ°λ‘ ꡬνμ΄ λμ΄μμΌλ©΄ μ’κ² λ€κ³ μκ°ν΄ κ²μ κΈ°λ‘μ 보κ΄νλ λ°°μ΄κ³Ό κ²μ κΈ°λ‘μ μ
λ°μ΄νΈνκ±°λ λ°νν μ μλ ν¨μλ₯Ό RecordManager
ν΄λμ€λ‘ λ°λ‘ ꡬννμμ΅λλ€.
class RecordManager {
// μ μ λ€μ κ²μ κΈ°λ‘μ κΈ°λ‘ν λ°°μ΄
private var recordArray: [Int] = []
// μ μ λ€μ κ²μ μ 보λ₯Ό μ μ₯ν ν¨μ
func setRecordArray(_ count: Int) {
recordArray.append(count)
}
// μ μ λ€μ κ²μ μ 보λ₯Ό μΆλ ₯νλ ν¨μ
func getRecordArray() {
if recordArray == [] {
print("κ²μ κΈ°λ‘μ΄ μ‘΄μ¬νμ§ μμ΅λλ€.")
}
recordArray.enumerated().forEach{ (i, count) in
print("\(i+1)λ²μ§Έ κ²μ : μλ νμ \(count)λ²")
}
}
}
μ΄ λΆλΆμμ κ²μ κΈ°λ‘μ 보κ΄νκ³ μλ recordArray
λ₯Ό private
λ‘ κ΅¬νν΄ ν΄λμ€ μΈλΆμμ μ κ·Όμ νμ§ λͺ»νλλ‘ νκ³ , κ²μ μ 보λ₯Ό μ μ₯νλ set
ν¨μμ κ²μ μ 보λ₯Ό μΆλ ₯νλ get
ν¨μλ‘ μ κ·Όμ νλλ‘ νμμ΄μ. μ΄ λΆλΆμμ μΉμ°¬μ λ°μ λ― ν©λλ€γ
!
λ λ²μ§Έ, "Userμ Numberλ λΉμ·ν κ΅¬μ‘°λ‘ λ§λ€ μ μμ κ±° κ°μμ. "
Userμ Number ν΄λμ€λ₯Ό λ°λ‘ ꡬννμμ§λ§, λ΄λΆμ μΌλ‘ μ μΈλ λ³μμλ ν΄λμ€ μΈλΆμμ μ κ·Όμ νλλ‘ κ΅¬νμ νμμ΄μ. μ΄ λΆλΆμ νΌλλ°±μ λ°λΌ privateλ‘ λ°κΎΈμ΄ μ£Όλ©΄μ νμν ν¨μλ₯Ό μΆκ°ν΄λ΄ μλ€.
UserClass
class User {
// μ λ΅κΉμ§μ νμ
var count: Int = 0
// μ μ κ° μ μν μ«μ
var userNum: Int?
// μ μ μκ² μ
λ ₯κ°μ λ°λ ν¨μ
func getUserInput() {
let input = readLine()
// λ¬Έμμ΄μ΄ μ
λ ₯λμ§ μμμ κ²½μ° μλ¬μ²λ¦¬
guard let input = input else { return getUserInput() }
// λ¬Έμμ΄μ΄ 3μλ¦¬κ° μλ κ²½μ° μλ¬μ²λ¦¬
if input.count != 3 {
print("0λΆν° 9κΉμ§λ₯Ό μλ¦Ώμλ‘ κ°μ§λ 3μ리 μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ 첫λ²μ§Έκ° 0μ΄ ν¬ν¨λμ΄ μλ κ²½μ° μλ¬μ²λ¦¬
if input.first == "0" {
print("μΈμ리 μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ΄ μ«μκ° μλ κ²½μ° μλ¬ μ²λ¦¬
guard let input = Int(input) else {
print("μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ΄ μ€λ³΅μ΄ λ κ²½μ° μλ¬μ²λ¦¬
// λ°±μ μ리, μμ μ리, μΌμ μ리
let hundred = input / 100
let tenDigit = ( input % 100 ) / 10
let one = input % 10
if hundred == tenDigit || tenDigit == one || hundred == one {
print("μ«μκ° μ€λ³΅λμμ΅λλ€.")
return getUserInput()
}
self.userNum = input
}
}
μ λ΅μ μ μν νμλ₯Ό λ΄λ count μ μ μ μκ²μ μ
λ ₯λ°μ μ«μ μ 보λ₯Ό λ΄μ userNum μ ν΄λμ€ μΈλΆμμ μ κ·Όνμ§ λͺ»νλλ‘ private
λ‘ κ΅¬ννμμ΄μ. λν count μ νμλ₯Ό μ¬λ €μ€ set ν¨μμ count λ₯Ό λΆλ¬μ¬ get ν¨μλ₯Ό λ°λ‘ ꡬνν΄μ£Όκ³ , userNum μ λ°μμ€λ get ν¨μλ₯Ό μΆκ°λ‘ ꡬννμμ΅λλ€. ν΄λμ€ μΈλΆμμ μμ λμ§ λͺ»νλ λλμ± μμ νκ² λ°μ΄ν°λ₯Ό μ μ₯ν μ μλλΌκ΅¬μ.
UserClass (μμ )
class User {
// μ λ΅κΉμ§μ νμ
private var count: Int = 0
// μ μ κ° μ μν μ«μ
private var userNum: Int?
// μ μ μκ² μ
λ ₯κ°μ λ°λ ν¨μ
private func getUserInput() {
let input = readLine()
// λ¬Έμμ΄μ΄ μ
λ ₯λμ§ μμμ κ²½μ° μλ¬μ²λ¦¬
guard let input = input else { return getUserInput() }
// λ¬Έμμ΄μ΄ 3μλ¦¬κ° μλ κ²½μ° μλ¬μ²λ¦¬
if input.count != 3 {
print("0λΆν° 9κΉμ§λ₯Ό μλ¦Ώμλ‘ κ°μ§λ 3μ리 μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ 첫λ²μ§Έκ° 0μ΄ ν¬ν¨λμ΄ μλ κ²½μ° μλ¬μ²λ¦¬
if input.first == "0" {
print("μΈμ리 μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ΄ μ«μκ° μλ κ²½μ° μλ¬ μ²λ¦¬
guard let input = Int(input) else {
print("μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return getUserInput()
}
// λ¬Έμμ΄μ΄ μ€λ³΅μ΄ λ κ²½μ° μλ¬μ²λ¦¬
// λ°±μ μ리, μμ μ리, μΌμ μ리
let hundred = input / 100
let tenDigit = ( input % 100 ) / 10
let one = input % 10
if hundred == tenDigit || tenDigit == one || hundred == one {
print("μ«μκ° μ€λ³΅λμμ΅λλ€.")
return getUserInput()
}
self.userNum = input
}
func getUserNum() -> Int? {
getUserInput()
return userNum
}
func setUserCount() {
count += 1
}
func getUserCount() -> Int {
return count
}
}
μ΄μ Numberλ λ³κ²½ν΄λ΄ μλ€.
NumberClass
class Number {
var num: Int?
func getRandomNum() {
var num = [Int]()
while num.count < 3 {
let a = Int.random(in: 0...9)
if num == [] && a != 0 {
num.append(a)
}else if num != [] && !num.contains(a) {
num.append(a)
}
}
self.num = num[0] * 100 + num[1] * 10 + num[2] * 1
}
}
μμ μ½λμμ κ²μμ μ λ΅μ μ μ₯ν num μ private
λ‘ μμ ν΄μ£Όλ©΄μ ν΄λΉ num μ μΆλ ₯ν μ μλ getRandomNum ν¨μκΉμ§ ꡬνμ ν΄μ£Όμμ΄μ.
NumberClass(μμ )
class Number {
private var num: Int?
private func makeRandomNum() {
var num = [Int]()
while num.count < 3 {
let a = Int.random(in: 0...9)
if num.isEmpty && a != 0 {
num.append(a)
}else if !num.contains(a) {
num.append(a)
}
}
self.num = num[0] * 100 + num[1] * 10 + num[2] * 1
}
func getRandomNum() -> Int? {
makeRandomNum()
return num
}
}
μΈ λ²μ§Έ, μΆκ°μ μΈ μ½λ ꡬνμ νΌλλ°±
"λΉ λ°°μ΄μΈμ§ 체ν¬ν λλ someArray.isEmptyλ₯Ό νμ©ν΄λ³΄μΈμ."
μ λ μ½λ©ν μ€νΈλ₯Ό ν λμλ νμ λΉ λ°°μ΄μ 체ν¬νλ λ¬Έμμμλ
if someArray == [] {
// λ΄λΆ μ½λ
}
μ΄λ κ² κ΅¬νμ νμμλλ°, λ°°μ΄μ isEmpty
λΌλ ν¨μκ° μμλμ§ λͺ°λλ€μ!γ
μ΄μ isEmpty
λ₯Ό μ κ·Ήμ μΌλ‘ νμ©ν΄μΌν κ² κ°μ΅λλ€.
"String(user).map{ Int(String($0))! }μ String(user).compactMap{ Int(String($0))} κ³Ό κ°μ΅λλ€."
μΌλ¨ μ΄ λΆλΆμ μ κ° map
κ³Ό compactMap
μ μ°¨μ΄μ λν μ§μμ΄ λΆμ‘±νλ κ±° κ°μμ. μ΄ λ¬Έμ₯μ 보μλ§μ μ€λ ν΄μΌν μΌμ map
, compactMap
, flatMap
μ 곡λΆνκ³ κ·Έ μ°¨μ΄λ₯Ό ν¬μ€ν
ν΄μΌκ² λ€κ³ μκ°μ΄ λ€μμ΅λλ€. λ°λ‘ 곡λΆν΄μ ν¬μ€ν
νμ¬ κΈ λ§ν¬ 첨λΆν΄λκ²μ! γ
π map, compactMap, flatMapμ μ°¨μ΄
λ€ λ²μ§Έ, "enumμ νμ©ν΄μ choiceλΆλΆμ 리ν©ν λ§ν΄λ³΄μΈμ."
κ°μ μ’ λ₯μ νμ μ μΈ μΌμ΄μ€λ enumμΌλ‘ ꡬννμ¬ κ·Έ μ΄μΈμ μΌμ΄μ€κ° λ€μ΄μ€λ κ²μ λ§μ μ μλ€κ³ μ λ² κ³Όμ λλ λ§μν΄μ£Όμ ¨λλ°, κ³ μ κΉλ¨Ήκ³ κ·Έλ₯ switchλ‘λ§ κ΅¬νν λ°λ³΄ λͺ½μΆ©μ΄ λ.. μ΄κ±΄ μ μ λΆμ°°μ΄λ―λ‘ λ°μ±ν¨λλ..γ
κΈ°μ‘΄μ MainPlayμμ choiceμ μ¬μ©μκ° μ νν κ°μ λ°μμ switch λ¬Έμ ν΅ν΄ κ°κ°μ μνμ λ°λ₯Έ μ½λλ₯Ό μ§°λλ°μ. choiceNum ν¨μμμ 1, 2, 3κ³Όλ λ€λ₯Έ μΌμ΄μ€κ° λ€μ΄μμ λμ 쑰건μ μΌμΌν ꡬνν΄μΌνμ΄μ.
MainPlay ν΄λμ€
class MainPlay {
init() {
main()
}
let recordManager = RecordManager()
// MARK: - μ«μλ₯Ό μ ννλ choiceNum() ν¨μ
private func choiceNum() -> Int {
print("---------------------------------------")
print("1. κ²μ μμνκΈ° 2. κ²μ κΈ°λ‘보기 3. μ’
λ£νκΈ° ")
print("=======================================")
let choice = readLine()
guard let choice = choice else {
return choiceNum()
}
guard let choice = Int(choice) else {
print("μ«μλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
return choiceNum()
}
if 1 > choice || choice > 3 {
print("λ²νΈλ₯Ό μλͺ» μ
λ ₯νμ
¨μ΅λλ€. λ€μ μ
λ ₯ν΄μ£ΌμΈμ. ")
return choiceNum()
}else {
return choice
}
}
// MARK: - λ©μΈ ν¨μ
func main() {
print("=======================================")
print("νμν©λλ€!! μνμλ λ²νΈλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
// λ²νΈλ₯Ό μ
λ ₯νλ ν¨μ
let choice = choiceNum()
switch choice {
case 1 :
let startGame = GamePlay()
let gameCount = startGame.start()
recordManager.setRecordArray(gameCount)
return main()
case 2 :
// κΈ°λ‘보기
recordManager.getRecordArray()
return main()
case 3 :
// μ’
λ£νκΈ°
print("[ μ«μ μΌκ΅¬ κ²μμ μ’
λ£ν©λλ€ ]")
break
default :
return main()
}
}
}
μ΄κ±°λ₯Ό μλμ μ½λλ‘ μμ νμ΅λλ€!
MainPlay ν΄λμ€
class MainPlay {
init() {
main()
}
let recordManager = RecordManager()
enum Choice: String {
case start = "1"
case record = "2"
case exit = "3"
}
// MARK: - μ«μλ₯Ό μ ννλ choiceNum() ν¨μ
private func choiceNum() -> Choice {
let choice = readLine()
guard let choice = choice else { return choiceNum() }
guard let choice = Choice(rawValue: choice) else {
print("μλͺ» μ
λ ₯νμμ΅λλ€. λ€μ μ
λ ₯ν΄μ£ΌμΈμ.")
return choiceNum()
}
return choice
}
// MARK: - λ©μΈ ν¨μ
func main() {
print("=======================================")
print("νμν©λλ€!! μνμλ λ²νΈλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.\n")
print("1. κ²μ μμνκΈ° 2. κ²μ κΈ°λ‘보기 3. μ’
λ£νκΈ° ")
print("=======================================")
switch choiceNum() {
case .start :
let startGame = GamePlay()
let gameCount = startGame.start()
recordManager.setRecordArray(gameCount)
return main()
case .record :
// κΈ°λ‘보기
recordManager.getRecordArray()
return main()
case .exit :
// μ’
λ£νκΈ°
print("[ μ«μ μΌκ΅¬ κ²μμ μ’
λ£ν©λλ€ ]")
break
}
}
}
μ¬μ©μμκ² λ¬Έμμ΄μ λ°μμ€λ κ³Όμ μμ 1, 2, 3μ μ μΈν λ¬Έμμ΄μ΄λ©΄ λ€ λ€μ μ λ ₯μ λ°μμ μ½λκ° μμ£Ό κΉλνκ² κ°κ²°ν΄μ€¬μ΄μ! λν λ¬Έμμ΄μ κ΅³μ΄ μ«μλ‘ λ°κΎΈμ§ μμλ λμ΄ μ½λκ° ν μ€ λ μ€μμ΅λλ€.γ γ
μΆκ°μ μΌλ‘ νν
¨λκ»μ failable init
μ λν΄μ μκ°ν΄λ³΄λΌκ³ νμ
¨λλ°, μ΄μ¬ν μ°Ύμ보λ failable init
μ μ€ν¨ν κ°λ₯μ±μ΄ μλ μμ±μμ΄λλΌκ΅¬μ! μλ ν΄λμ€, ꡬ쑰체, μ΄κ±°νμ μμ±μλ 무쑰건 μ±κ³΅νλλ‘ κ΅¬νμ΄ λμ΄μμ΄μ. νμ§λ§ failable init
μ μ±κ³΅νλ©΄ μ΄κΈ°κ°μ λΆμ¬νκ³ , μ€ν¨νλ©΄ nil
μ λ°νν©λλ€. κ·Έλμ μ΅μ
λκ°λ€λ μκ°μ΄ λ€μμ΄μ.
λ€μ μμ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ Choice( rawValue: String )
λΆλΆμ΄ μ΄κ±°νμ failable init
μ΄μ¬μ guard let
μ ν΅ν unwrapping
κ³Όμ μ κ±°μΉκ³ μμ΄μ. λ§μ½ unwrapping
λμ§ μλλ€λ©΄ μ¦, μ¬μ©μκ° μ
λ ₯ν λ¬Έμκ° "1", "2", "3"μ μ μΈν λ¬Έμμ΄μ΄λΌλ©΄ λ€μ chioceNum μ½λκ° μ€νμ΄ λλ κ±°μ£ !
μ΄λ κ² νΌλλ°±μ λν λ°μμ ν΄λ³΄μλλ°μ?!
μ€λλ μ±μ₯ν λ μμ£Ό λ©μ₯μλ?!γ γ γ γ γ γ γ
κΈ°λΆ μ’μ΅λλ€μ!π