[swift]index out of range 오류 //초보자 입니다..
조회수 2492회
xcode 9.2 버전 커맨드라인으로 코딩 중입니다.
makeLadder함수 안의 makeWall 에서 index out of range오류가 발생해서 제대로 결과를 못 받고 있습니다. 어디를 수정해야 올바른 결과가 나올까요..ㅠㅠ
예)
참여할 사람은 몇 명 인가요?
3
최대 사다리 높이는 몇 개인가요?
4
//현재 상태
| | |
| |-|
|-| |
|
//나와야 하는 결과
| | |
| |-|
|-| |
|-| |
코드
import Foundation
// 참여인원 입력 받기
func getPlayer() -> Int {
print("참여할 사람은 몇 명 인가요?")
let player = readLine()
return Int(player ?? "") ?? 0
}
// 사다리 높이 입력 받기
func getLadderHeight() -> Int {
print("최대 사다리 높이는 몇 개인가요?")
let ladderHeight = readLine()
return Int(ladderHeight ?? "") ?? 0
}
// 사다리 발판 준비 - 서브
// false 값을 가지고 있는 배열을 랜덤값에 따라 랜덤하게 false를 true로 바꿈
func randomChange(_ arrLadder:[Bool]) -> [Bool]{
var ladderArr:[Bool] = arrLadder
for val in 0 ..< ladderArr.count {
let random = arc4random_uniform(2)
ladderArr[val] = (random == 0)
}
return ladderArr
}
// 사다리 발판 준비 - 메인
func makeLadderFrame(_ player:Int, _ ladderHeight:Int) -> [[Bool]] {
var arrLadder: [[Bool]] = Array(repeating: Array(repeating: false, count: player - 1), count: ladderHeight)
return arrLadder
}
func preparadeToMakeFootBoard(_ ladderHeight: Int, _ player: Int) -> [[Bool]] {
var arrLadder = makeLadderFrame(player,ladderHeight)
for row in 0 ..< ladderHeight {
arrLadder[row] = randomChange(arrLadder[row])
}
return arrLadder
}
// 사다리 발판 만들기
// 발판 요소
enum LadderFootBoardElements: String {
case hasFootBoard = "-"
case noFootBoard = " "
}
// readyToMakeFootBoard에서 만든 불값2차원배열을 발판 요소들로 대체시키기
func transferBoolToHorizon(booleanElement: Bool) -> String {
return booleanElement ? LadderFootBoardElements.hasFootBoard.rawValue : LadderFootBoardElements.noFootBoard.rawValue
}
// 사다리 모양 완성시키기 - 서브
func makeWall(_ readyFootBoard:[Bool],_ player: Int) {
for val in 0 ..< player - 1 {
let footboard = transferBoolToHorizon(booleanElement: readyFootBoard[val])
print ("\(footboard)", terminator : "|")
}
}
// 사다리 모양 완성시키기 - 메인
func makeLadder(_ player: Int, _ ladderHeight:Int) {
let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight)
for row in 0 ..< ladderHeight {
print ("|", terminator: "")
makeWall(readyFootBoard[row], player)
print()
}
}
// main (실행 부)
while true {
let player = getPlayer()
let ladderHeight = getLadderHeight()
makeLadder(player, ladderHeight)
break
}
1 답변
-
//이 함수에서 받는 인자가 ladderHeight에 player 값이 들어오고, player에 ladderHeight 값이 들어와서 index out of range 오류가 나는 거 값습니다. func preparadeToMakeFootBoard(_ ladderHeight: Int, _ player: Int) -> [[Bool]] { var arrLadder = makeLadderFrame(player,ladderHeight) for row in 0 ..< ladderHeight { arrLadder[row] = randomChange(arrLadder[row]) } return arrLadder } // let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight)
preparadeToMakeFootBoard 함수에서 받는 인자 변경해주고 player 값에서 -1 해주던거 제거한 소스 입니다. (player값이 높이 값으로 설정이 되어 있어서 -1 해주신거 같아서 일단 뺀 소스로 변경 해봤습니다.)
//수정한 소스 // // main.swift // af // // Created by maccli1 on 2018. 1. 22.. // Copyright © 2018년 myoung. All rights reserved. // import Foundation // 참여인원 입력 받기 func getPlayer() -> Int { print("참여할 사람은 몇 명 인가요?") let player = readLine() return Int(player ?? "") ?? 0 } // 사다리 높이 입력 받기 func getLadderHeight() -> Int { print("최대 사다리 높이는 몇 개인가요?") let ladderHeight = readLine() return Int(ladderHeight ?? "") ?? 0 } // 사다리 발판 준비 - 서브 // false 값을 가지고 있는 배열을 랜덤값에 따라 랜덤하게 false를 true로 바꿈 func randomChange(_ arrLadder:[Bool]) -> [Bool]{ var ladderArr:[Bool] = arrLadder for val in 0 ..< ladderArr.count { let random = arc4random_uniform(2) ladderArr[val] = (random == 0) } return ladderArr } // 사다리 발판 준비 - 메인 func makeLadderFrame(_ player:Int, _ ladderHeight:Int) -> [[Bool]] { let arrLadder: [[Bool]] = Array(repeating: Array(repeating: false, count: player), count: ladderHeight) return arrLadder } func preparadeToMakeFootBoard(_ player: Int, _ ladderHeight: Int) -> [[Bool]] { var arrLadder = makeLadderFrame(player,ladderHeight) for row in 0 ..< ladderHeight { arrLadder[row] = randomChange(arrLadder[row]) } return arrLadder } // 사다리 발판 만들기 // 발판 요소 enum LadderFootBoardElements: String { case hasFootBoard = "-" case noFootBoard = " " } // readyToMakeFootBoard에서 만든 불값2차원배열을 발판 요소들로 대체시키기 func transferBoolToHorizon(booleanElement: Bool) -> String { return booleanElement ? LadderFootBoardElements.hasFootBoard.rawValue : LadderFootBoardElements.noFootBoard.rawValue } // 사다리 모양 완성시키기 - 서브 func makeWall(_ readyFootBoard:[Bool],_ player: Int) { for val in 0 ..< player { let footboard = transferBoolToHorizon(booleanElement: readyFootBoard[val]) print ("\(footboard)", terminator : "|") } } // 사다리 모양 완성시키기 - 메인 func makeLadder(_ player: Int, _ ladderHeight:Int) { let readyFootBoard = preparadeToMakeFootBoard(player, ladderHeight) for row in 0 ..< ladderHeight { print ("|", terminator: "") makeWall(readyFootBoard[row], player) print() } } // main (실행 부) while true { let player = getPlayer() let ladderHeight = getLadderHeight() makeLadder(player, ladderHeight) break }
//결과값 참여할 사람은 몇 명 인가요? 3 최대 사다리 높이는 몇 개인가요? 4 | | |-| | |-| | | |-| | | | | |
의도가 다를 수 있고, 틀린점이 있다면 댓글 남겨주시면 추가적으로 도와 드리겠습니다.
댓글 입력