Swift에서는 기본 제공되는 연산자뿐만 아니라 연산자를 직접 정의하거나 옵셔널 타입에도 오버로딩을 통해 다양한 동작을 지정할 수 있다. 오늘은 아래와 같은 내용을 중심으로 Swift의 연산자 활용법을 정리해본다
+ 연산자Person, Family) 간의 연산자 정의+ 연산자 오버로딩func + (
lhs: String?,
rhs: String?
) -> String? {
switch(lhs, rhs) {
case(.none, .none):
return nil
case let (.some(value), .none),
let (.none, .some(value)):
return value
case let (.some(lhs), .some(rhs)):
return lhs + rhs
}
}
String 타입도 + 연산을 사용할 수 있도록 오버로딩 함.nil이면 결과도 nil.nil이면, 다른 쪽 값을 반환.let firstName: String? = "Foo"
let lastName: String? = " Bar"
let fullName = firstName + lastName // "Foo Bar"
prefix)prefix operator ^
prefix func ^ (value: String) -> String {
value.uppercased()
}
let lowercaseName = "Foo Bar"
let uppercaseName = ^lowercaseName // "FOO BAR"
^"hello" → "HELLO"postfix)postfix operator *
postfix func * (value: String) -> String {
"*** \(value) ***"
}
let widthStars = lowercaseName* // "*** Foo Bar ***"
"hello"* → "*** hello ***"struct Person {
let name: String
}
struct Family {
let members: [Person]
}
func + (lhs: Person, rhs: Person) -> Family {
Family(members: [lhs, rhs])
}
func + (lhs: Family, rhs: Person) -> Family {
var members = lhs.members
members.append(rhs)
return Family(members: members)
}
func + (lhs: Family, rhs: [Person]) -> Family {
var members = lhs.members
members.append(contentsOf: rhs)
return Family(members: members)
}
let mom = Person(name: "Mom")
let dad = Person(name: "Dad")
let son = Person(name: "Son")
let daughter1 = Person(name: "Daughter1")
let daughter2 = Person(name: "Daughter2")
let family = mom + dad // Family with mom and dad
let familyWithChildren = family + son // Family with mom, dad, son
let familyWithDaughters = familyWithChildren + [daughter1, daughter2]
| 개념 | 설명 |
|---|---|
옵셔널 + 오버로딩 | nil 처리까지 고려한 안전한 문자열 결합 방식 제공 |
| 전위/후위 연산자 | 개발자가 의도한 방식으로 표현력 있는 코드 구성 가능 |
| 커스텀 타입 연산자 오버로딩 | 연산자 문법을 활용해 DSL처럼 표현 가능함 |
Swift에서는 연산자 오버로딩과 사용자 정의 연산자 기능을 통해 표현력 있는 코드, 안전한 로직 처리, 가독성 좋은 DSL 형태의 인터페이스를 만들 수 있다. 단, 과한 오버로딩은 오히려 가독성을 해칠 수 있으므로 적절한 수준에서 명확한 의미를 갖도록 정의하는 것이 중요하다.