Swift

AnyObject & Overloading

728x90

안녕하세요:)

 

오늘은 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이 동일하다면 리턴형으로 구별합니다.
728x90

'Swift' 카테고리의 다른 글

Class Initializer  (0) 2020.12.14
Initializer & Memberwise Initializer  (0) 2020.12.07
Type Casting  (0) 2020.12.07
Upcasting & Downcasting  (0) 2020.12.07
Inheritance & Overriding  (0) 2020.12.07