[Swift] - AnyObject & Overloading

Din의 개발노트·2020년 12월 16일

안녕하세요:)
오늘은 Swift가 제공하는 범용 자료형과 오버로딩을 통해 동일한 이름을 가진 멤버를 구현하는 방법에 대해서 알아보도록 하겠습니다!

1. Any & AnyObject (범용 자료형)

  • 범용 자료형은 코드의 유연성을 높여주는 장점이 있습니다.
  • 남용할 경우 코드의 가독성이 떨어지고 코드의 유지 보수가 힘들어집니다.
  • Any는 모든 형식을 저장할 수 있고, AnyObject는 모든 클래스 형식을 저장할 수 있습니다.
var data: Any = 1
data = 2.3
// Any로 선언하면 형식에 관계없이 모든 자료형을 저장할 수 있습니다.
data = "Str"
data = [1, 2, 3]

// AnyObject는 참조 형식만 저장할 수 있습니다.
var obj: AnyObject = NSString()
//obj = 1  에러

// 인스턴스를 사용하기 위해서는 타입 캐스팅이 필요합니다.
// Any와 AnyObject는 타입 캐스팅이 핋요합니다.

if let str = data as? String {
    print(str.count)
} else if let list = data as? [Int] {
    
}

// Type Casting Pattern

switch data {
case let str as String:
    print(str.count)
case let list as [Int]:
    print(list.count)
case is Double:
    print("Double Value")
default:
    break
}

2. Overloading

  • 하나의 형식에서 동일한 이름을 가진 다수의 멤버를 구현할 때 사용합니다.
  • 이름이 같아도 파라미터가 다르면 사용할 수 있습니다.
  • 함수, 메소드, 서브스크립트, 생성자에서 사용 가능합니다.
func process(value: Int) {
    print("process Int")
}

func process(value: String) {
    print("process String")
}

func process(value: String, anotherValue: String) {
    
}

func process(_ value: String) {
    
}

process(value: 0)
process(value: "str")
process("str")

func process(value: Double) -> Int {
    return Int(value)
}

func process(value: Double) -> String? {
    return String(value)
}

let result: Int = process(value: 12.34)
let result2: String? = process(value: 12.34)
let result3 = process(value: 12.34) as Int

//메소드, 생성자, 성브스크립트에서도 동일한 규칙이 사용됩니다.

struct Rectangle {
    func area() -> Double {
        return 0.0
    }
    
    static func area() -> Double {
        return 0.0
    }
}

let r = Rectangle()
r.area()
Rectangle.area()

함수 이름이 동일하다면 선언된 파라미터 수로 구분합니다.
함수 이름, 파라미터 수가 동일하다면 파라미터 자료형으로 구별합니다.
함수 이름, 파라미터 수와 자료형이 동일하다면 Argument Label로 구별합니다.
함수 이름, 파라미터, Argument Label이 동일하다면 리턴형으로 구별합니다.

profile
iOS Develpoer

0개의 댓글