develop

==과 ===의 차이, closure의 === 본문

iOS

==과 ===의 차이, closure의 ===

pikachu987 2021. 6. 22. 21:45
반응형

==(Equivalence Operators 같음 비교 연산자) 는 일반적으로 값을 비교한다.

https://developer.apple.com/documentation/swift/equatable/1539854

 

Apple Developer Documentation

 

developer.apple.com

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

 

Apple Developer Documentation

 

developer.apple.com

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

 

How do you test functions and closures for equality?

The book says that "functions and closures are reference types". So, how do you find out if the references are equal? == and === don't work. func a() { } let å = a let b = å === å // Could not fin...

stackoverflow.com

 

반응형

'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