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 |
Tags
- combine
- 프로그래머스
- DependencyInjection
- DispatchQueue
- MethodSwilzzling
- 등굣길
- 코테
- SeSAC
- data_structure
- 명품cppProgramming c++
- IOS
- MainScheduler
- DynamicMemberLookup
- 오픈채팅방
- RaceCondition
- DiffableDataSource
- leetcode
- Realm
- cleanarchitecture
- swift
- MainScheduler.asyncInstance
- SRP
- CoreBluetooth
- 청년취업사관학교
- SwiftUI
- GCD
- MainScheduler.Instance
- gitflow
- baseviewcontroller
- rxswift
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