develop
==과 ===의 차이, closure의 === 본문
반응형
==(Equivalence Operators 같음 비교 연산자) 는 일반적으로 값을 비교한다.
https://developer.apple.com/documentation/swift/equatable/1539854
let first: Int = 1
let second: Int = 2
print(first == second)
class에서 ==을 하려면 Equatable을 채택하여야 한다.
class에서 기본적으로 NSObject를 자주 상속받는데 NSObject는 Equatable을 채택하고 있다.
===(Identity Operators 식별연산자) 는 값을 비교하는게 아니라 참조값을 비교를 한다.
https://developer.apple.com/documentation/swift/1538988
class CustomClass {
}
let customClass1 = CustomClass()
let customClass2 = CustomClass()
print(customClass1 === customClass2)
위의 상황에서는 콘솔창에 false가 찍힌다.
let customClass1 = CustomClass()
let customClass2 = CustomClass()
let customClass3 = customClass1
// false
print(customClass1 === customClass2)
// true
print(customClass1 === customClass3)
customClass1과 customClass3은 참조하는 객체가 같기 때문에 참조값이 같다.
참조값이 있는 class만 === 또는 !== 를 사용할수 있고
구조체, 열거형 등은 참조를 하지 않기 때문에 ===, !==를 사용할수 없다.
class CustomClass {
}
class CustomClassTest {
}
let customClass = CustomClass()
let customClassTest = CustomClassTest()
// false
print(customClass === customClassTest)
같은 클래스가 아니더라도 참조값을 비교하는거라 ===는 사용할수 있다.
함수나 closure는 reference 타입이지만 === 를 사용할수 없다.
함수나 closure에 ===를 사용한다면 컴파일러는 특정 캡쳐 최적화를 수행할 수 없는 등의 이슈가 생겨버려서
최적화에 영향을 미칠 수 있기 때문에 사용할 수 없다.
https://stackoverflow.com/a/25694072/7304854
반응형
'iOS' 카테고리의 다른 글
frame과 bounds의 차이 (0) | 2021.07.11 |
---|---|
Hashable에 대해 (0) | 2021.06.23 |
iOS에서 srt, smi 파일 한글 깨지는 문제 (0) | 2021.03.01 |
UITableView UICollectionView Reorder (0) | 2021.02.07 |
GCD (0) | 2021.02.06 |
Comments