Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- CoreBluetooth
- DiffableDataSource
- rxswift
- DependencyInjection
- swift
- 청년취업사관학교
- GIT
- GCD
- DispatchQueue
- combine
- Realm
- 오픈채팅방
- MainScheduler.Instance
- gitflow
- cleanarchitecture
- 등굣길
- SeSAC
- leetcode
- RaceCondition
- MainScheduler
- DynamicMemberLookup
- 명품cppProgramming c++
- MethodSwilzzling
- 프로그래머스
- IOS
- SwiftUI
- data_structure
- SRP
- 코테
- MainScheduler.asyncInstance
Archives
- Today
- Total
Do.
Swift - firstIndex(of:) 가 없을 때 본문
특정 객체를 배열로 저장하는 변수를 만들었을 때
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
}
}
'iOS' 카테고리의 다른 글
Swift - Class와 Object의 차이점 (0) | 2022.02.09 |
---|---|
Swift - Float, Double을 Int로 바꾸기, 반올림, 올림, 내림 (0) | 2022.02.09 |
Swift - JSON Encoding과 Decoding - Part3 (0) | 2022.02.09 |
Swift - JSON Encoding과 Decoding - Part2 (0) | 2022.02.09 |
Swift - JSON Encoding과 Decoding - Part1 (0) | 2022.02.09 |
Comments