[Swift] 배열 index 조회 및 삭제하기

2020. 8. 13. 11:33iOS/Swift

배열(정확히는 Collection)에서 값을 조회하는 방법을 알아보자.

 

firstIndex(of:) 는 배열의 앞에서부터 조회해서 첫번째 일치하는 값의 index를 반환한다.

lastIndex(of:) 는 배열의 뒤에서부터 조회해서 첫번째 일치하는 값의 index를 반환한다. 

var arr: [String] = ["일번", "이번", "삼번", "사번", "이번", "육번"]


if let firstIndex = arr.firstIndex(of: "이번") {
    print(firstIndex)  // 1
}

if let lastIndex = arr.lastIndex(of: "이번") {
    print(lastIndex)  // 4
}

반환된 값은 Int? 이다. (조회했을 때 일치하는 값이 없을 경우가 있기때문에 옵셔널)

 

받아온 index의 값을 삭제하고 싶다면

if let firstIndex = arr.firstIndex(of: "이번") {
    arr.remove(at: firstIndex)
}
// ["일번", "삼번", "사번", "이번", "육번"]

 

조회하는 다른 방법으로는 firstIndex(where:), lastIndex(where:) 도 있다.

배열을 조회해서 일치하는 값의 index를 반환하는 것은 같다.

그리고 'Equatable'을 준수하거나 그 조건에 맞는 값을 반환한다.

 

예를 들어, UserInfo라는 모델이 있고, 그것을 모아 둔 userInfo라는 배열이 있다.

struct UserInfo {
    let name: String
    let phone: String
}

var userInfo: [UserInfo] = [값이 여러개 있다는 가정]

거기서 동명이인이 많은 이 세상에서 리스트에서 "민이" 라는 이름을 가진 첫번째 사람의 휴대폰 번호를 찾고싶다 라면

if let index = userInfo.firstIndex(where: { $0.name == "민이" }) {
    print(userInfo[index].phone)
}

리스트에서 "민이"라는 이름을 가진 마지막 사람을 찾고싶으면 lastIndex(where:) 를 사용하면 된다.

 

만약,

나는 "민이" 라는 이름을 가지고 있는 사람을 다 지워버리고 싶어. 하면

userInfo.removeAll(where: { $0.name == "민이" })

로 해주면 리스트 내에서 "민이"라는 이름을 가진 값은 remove될 것이다.

 

 

평소 중복 제거 할때 인덱스 찾아와서 값 삭제했는데 removeAll을 미리 알았더라면 ㅠ..

다시 또 열심히 공부해야겠다.