protocol Equatable

글 작성중입니다.
글 하나 작성하는데 상당히 오랜 시간이 필요하네요..
곧 마무리 해서 올리겠습니다.

iOS 개발을 하다보면 꽤 많은 프로토콜들이 등장한다.
대부분의 개발자들은 별 생각없이 넘어갈것이라고 생각한다.
그러다가 어느순간에 이건 도대체 뭐지? 라는 의문이 들것이고 이에 대해 알고 싶어질것이라 생각한다.
지금 내가 그렇고, 매번 궁금한게 생길때마다 다시 찾아보는 수고를 덜기 위해 정리해보려고 한다.

equatable| ikwéitəbl | 형용사 | 동일시할 수 있는.

아래 애플링크에 있는 글들을 정리를 좀 해볼께요.
좀 보기 편하게 제 스타일대로 의역을 좀 해놨습니다.
틀린부분이 있다면 알려주세요.

Equatable

Type의 같음을 비교할 수 있다.

개요

Equatable 프로토콜을 따르는 Type들은 equal-to operator (==) 또는 불균형인지를 not-equal-to operator (!=)를 사용하여 비교 할수 있다.

배열와 컬렉션은 Equatable을 만족할때, 쉽게 비교를 수행할수 있다.
예를 들면 다음과 같다.
배열의 요소들이 Equatable을 만족할 때, 제공되는 closure를 사용하여 비교하지 않고, 특별한 값을 포함하고 있는지를 contains(_:) 메소드를 사용하여 체크할수 있다.

let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]

let nameToCheck = "Kofi"
if students.contains(nameToCheck) {
    print("\(nameToCheck) is signed up!")
} else {
    print("No record of \(nameToCheck).")
}
// Prints "Kofi is signed up!"

Equatable Protocol을 따르기

Equatable을 당신이 만든 Type에 추가한다는 것은, Collection에서 특별한 인스턴스를 찾기 위해 convenient APIs를 사용한다는 뜻이다.
Equatable은 base protocol이며, Hashable과 Comparable protocols에도 사용된다.
그리고, Collection의 요소들을 sets과 sorting하여 구성하는 것처럼, custom type을 사용할수 있게 해준다.

Equtable을 만족시며 type를 생성하기 위해서는 다음 두가지를 충족시켜야 한다.

  • Struct일 경우, 모든 properties가 Equatable을 만족 시켜야 한다.
  • Enum일 경우, 모든 value들이 Equatable을 만족 시켜야 한다.
    (value없는 enum은 선언없이 만족된다. 맞는 해석인지 모르겠다. 테스트 필요.)

작성중…

  • 참고 링크
  • https://developer.apple.com/documentation/swift/equatable

억음부호 `Swift`

나이가 들어가면서, 점점 미래가 불안해지고 뭐하고 먹고 살아가야하나 고민을 하고 있다.

그래서, 내가 제일 잘 할수 있는 코딩(?)을 더 잘하려고 한다.
늦은감이 있지만, RxSwift부터 최신트랜드를 학습하며 따라가려고 노력중이다.
Swift를 좀 깊게 학습하고 싶어서 코쟁이 형들하고, 잘한다는 형들의 소스를 보고 있는 중이다.

그러던 오늘, 억음이라고 불리는 ` 표시의 소스코드를 발견하였다.
이 표시가 억음이라는걸 알아내는데도 꽤 시간이 걸렸다. 영어로는 backtick이라고 표현하는것 같다.(추측..)

Martin이라는 멋진형이 쓴글을 직독해서 블로그한다.
마틴형 링크는 하단에 표기해놓았다. 똑똑한 형 같으니 그 블로그를 뒤적거려보는것도 좋을것 같다.
오역이 있을수 있으니, 오역이나 더 좋은 표현이 있다면 댓글로 남겨주길 부탁한다. (반말로 쓰는 이유는 내 블로그에 내가 쓰면서 존칭을 쓰면 이상한 기분이 들어서랄까…)

`은 language keywords로부터 identifier를 만들수 있게 해준다고 한다.

Swift에서 C 또는 Objective-C function을 직접 호출할수 있다, 그러나 C function이름이 guard라면 억음 없이 호출할수 없다.

`guard`()

더 좋은 예제로 enum을 들수 있다. 다음과 같은 값들을 가진 enum을 만들고 싶을수 있다.

enum Foo {
    case `var`
    case `let`
    case `class`
    case `func`
}

let items = [Foo.class, Foo.let, .var]

억음을 사용하면 reserved language keywords를 사용할 수 있다.

당신이 애플 API 디자인처럼 default keyword를 property 이름으로 사용하고 싶다면, 이때 억음을 사용할 수 있다.
NotificationCenter가 싱글톤으로 default를 사용하고 있으며, 이 default는 keyword이며 switch statements로 사용된다.
이를 구현하기 위해서는 다음과 같이 사용하면 된다.

class MyOwnNotificationCenter {
    static let `default` = MyOwnNotificationCenter()
    ...
}

클로져에서 [weak self]를 사용해본적이 있나요? 그렇지 않다면 사용하셔야 합니다.
self를 weak reference하게 만들었을때, self는 optional이고 가끔씩은 문제를 일으키게 됩니다.
Swift4.2 이전에 strong reference self의 이름을 유지하기 위해 다음과 같이 사용했습니다. (또는 strongSelf로 이름을 바꾸어서 사용)

self.provider.fetchData { [weak self] (fetchedData) in
    guard let `self` = self else { return }
    let processedData = self.processData(fetchedData)
    self.updateUI(with: processedData)
}

Swift4.2에서는 다음과 같이 사용합니다.

self.provider.fetchData { [weak self] (fetchedData) in
    guard let self = self else { return }
    let processedData = self.processData(fetchedData)
    self.updateUI(with: processedData)
}

이제 optional binding을 사용해서 weak를 strong으로 reference를 업그레이드 하였습니다.

  • 참고 사이트
  • https://blog.entirely.digital/swift-backticks/