Mobile-아이폰iOS

Swift3 Any/AnyObject 차이, === 연산자 용도, 타입비교

무한열정 2017. 8. 19. 12:00

* Any, AnyObject 차이

- Any는 포괄적인 개체들을 말하는것으로 Objective-C의 id와 동일하며

  Java에서 Object클래스와 비슷하다.

- AnyObject는 모든 클래스를 말하며 클래스에만 한정된다.


* === 연산자

Objective-C에는 없는 연산자로

2개의 객체가 완전 동일한지를 비교한다. 즉, 주소가 동일한 완전히 동일한 객체인지 비교


- 다만 Swift3에서 변경된 사항으로 AnyObject의 Optional Type으로 캐스팅해야 비교가 가능하다.

override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {

if sender.draggingSource() as AnyObject? === self {

return NSDragOperation()

}

highlightForDragging = true

return sender.draggingSourceOperationMask()

}



* typeOf 타입비교

  - Generic Type 까지 비교한다. 

var dic1:Any = [String : String]()

var dic2 = [String : Int]()


if type(of: dic1) == Dictionary<String,Int>.self {

    Swift.print("Dictionary<String,Int>")

} else {

    Swift.print("Not Dictionary<String,Int>")

}



* if is 타입비교

  - Swift3에서는 제너릭 타입을 지정해야 한다. 하지만 제너릭타입까지는 비교하지 않는다.

  - 필요없는데 왜 붙여야 하는걸까요? ㅜㅠ

var dic1:Any = [String : String]()

var dic2 = [String : Int]()


if dic1 is Dictionary<String,String> {

    NSLog("Dictionary OK")

} else {

    NSLog("Not Dictionary")

}



* Dictionary Type의경우 == 연산자로 비교

  - 특이하게 Swift에서는 == 연산자로 Dictionary가 가지고 있는 값의 내용이 비교된다.

var dic1:Any = [String : String]()

var dic2 = [String : Int]()


dic1["aa"] = "bb"

dic2["aa"] = "bb"


if dic1 == dic2 {

    NSLog("Dictionary content equal")

} else {

    NSLog("Dictionary content Not equal")

}