Do.

Swift - firstIndex(of:) 가 없을 때 본문

iOS

Swift - firstIndex(of:) 가 없을 때

Hey_Hen 2022. 2. 9. 15:59

 

특정 객체를 배열로 저장하는 변수를 만들었을 때

class MyObject {
  let name: String
  let isEnable: Bool
  
  init(name: String, isEnable: Bool) {
    self.name = name
    self.isEnable = isEnable
  }
}

struct MyObjectStore {
  var store: [MyObject] = []
  var isEmpty: Bool {
    store.isEmpty
  }
}

struct Main {
  var myObjectStore = MyObjectStore()
  init() {
    ...
  }
}
 
 

위와 같은 코드에서

만약 myObjectStore.store.firstIndex를 사용하고 싶은데

 

firstIndex(of:)가 없고

firstIndex(where:) rethrows 밖에 안보인다면 해당 객체가 Equatable 프로토콜을 채용하지 않아서 이다.

물론

let item = MyObject(name: "Obj", isEnable: true)
let _ = store.firstIndex { myObject in
  myObject.name == item.name && myObject.isEnable == item.isEnable
}
 

이런식으로 요소들을 다 비교해 주면 되지만 만약에 프로퍼티가 너무 많다면? 코드도 복잡해져서 관리하기 힘들어질 수 있다.

 

그래서 MyObject가 Equatable을 채용한다면 firstIndex(of:)를 사용할 수 있도록 하면 된다.

 

class MyObject: Equatable {
  let name: String
  let isEnable: Bool
  
  init(name: String, isEnable: Bool) {
    self.name = name
    self.isEnable = isEnable
  }
  
  static func ==(lhs: MyObject, rhs: MyObject) -> Bool {
    lhs === rhs
  }
}

struct MyObjectStore {
  var store: [MyObject] = []
  var isEmpty: Bool {
    store.isEmpty
  }
  
  init() {
    let item = MyObject(name: "Obj", isEnable: true)
    let _ = store.firstIndex(of: item)
  }
}
 

(만약 MyObject가 class가 아니라 sturct이면 '==' 연산자를 정의하지 않아도 자동으로 해결해준다.)

꼭 클래스로 써야 한다면 Equtable 프로토콜을 만족하기 위해 ==연산을 정의해도 되지만

NSObject 프로토콜을 채용하면 연산을 별도로 정의하지 않아도 된다.

class MyObject: NSObject {
  let name: String
  let isEnable: Bool
  
  init(name: String, isEnable: Bool) {
    self.name = name
    self.isEnable = isEnable
  }
}
 

 

 

Comments