일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DynamicMemberLookup
- rxswift
- RaceCondition
- MainScheduler.asyncInstance
- 등굣길
- leetcode
- SRP
- combine
- 코테
- gitflow
- 프로그래머스
- IOS
- SwiftUI
- DispatchQueue
- Realm
- cleanarchitecture
- MethodSwilzzling
- GCD
- swift
- 청년취업사관학교
- MainScheduler
- 명품cppProgramming c++
- DiffableDataSource
- SeSAC
- 오픈채팅방
- DependencyInjection
- CoreBluetooth
- MainScheduler.Instance
- GIT
- data_structure
- Today
- Total
Do.
Swift - 연산자 메소드와 커스텀 연산자 본문
(네이버 블로그에서 이전 중입니다)
Swift 공부중에 C++ 처럼 연산자 오버로딩과 커스텀 연산자 사용이 가능하다는 것을 알았다. Cpp 보다 훨씬 쉽고 편하게 (swift 전체가 그렇지만) 사용할 수 있다는 것을 알았다.
(C++의 연산자 오버로딩 과 Swift 의 연산자 메소드과 완벽히 치환되는 기능인지는 아직 잘 모르겠다)
https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html
Swift org에서 언어 가이드의 고-급 연산자 (가장 아래에 있더라)에서 찾을 수 있다.
연산자 중복은 Operator Methods 라는 명칭으로 제공되며 다음과 같이 사용할 수 있다.
Coord2D 라는 구조체가 있을 때 서로 다른 Coord2D 객체를 더하는 함수 메소드 이다.
기본적인 형식은 구조체를 extension 하여 아래와 같이 구현하면 된다.
static func operator(param) -> return {
//code
}
위 기본 형식을 통해 아래와 같이 구현할 수 있다.
struct Coord2D {
var x = 0
var y = 0
}
extension Coord2D {
static func + (lhs: Coord2D, rhs: Coord2D) -> Coord2D {
return Coord2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
}
let coord1 = Coord2D(x: 3, y: 4)
let coord2 = Coord2D(x: 5, y: 1)
coord1 + coord2
//Coord2D(x: 8, y: 6)
또 구조체 끼리 만약 Bool 값을 리턴하는 식 그러니까 비교연산 을 한다고 하면 일일이 코드를 써서 구현해줄 필요가 없다.Equivalence Operators 라는 것인데 Equatable 이라는 Protocol 로 아래와 같이 사용하면 구현할 필요 없이 사용할 수 있다.
extension Coord2D: Equtable {
static func + (lhs: Coord2D, rhs: Coord2D) -> Coord2D {
return Coord2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
}
coord1 == coord2 //false
먼저 사용했던 연산자 메소드에 바로 Equtable Protocol 을 선언했고 별다른 구현없이 coord1과 coord2 를 비교하는 연산자를 사용 가능하다.
이러한 사용 방법 외에도 연산자를 앞에 붙이냐 뒤에 붙이냐 즉 Prefix 와 Postfix를 통해 C에서 처럼 변수의 값을 1 증가 시키는 ++ 연산자를 구현할 수 있다.
Swift에서는 Int 자료형 또한 구조체로 구현되어 있기 때문에 아래와 같이 Operator Method 를 구현할 수 있다.
extension Int {
static prefix func ++(input: inout Int) {
input += 1
}
}
var val = 3
++val //val = 4
++param 식으로 사용할 것이기 때문에 위와 같은 형태를 따른다
만약 인수에서 inout 을 선언하지 않으면 인수를 상수로 보기 때문에 수정이 불가 하니 inout 을 추가로 명시한다.
param++ 식으로 사용할 거라면 아래와 같이 선언할 수 있겠다
extension Int {
static prefix func ++(input: inout Int) {
input += 1
}
static postfix func ++(input: inout Int) -> Int {
let retN = input
input += 1
return retN
}
}
이외에도 커스텀 연산자 예를들어 +++ 를하면 더하기 2를 한다던가 하는 연산자도 사용할 수 있다.
Custom Operators 로 Swift.org 같은 문서에 적용되어 있고 사용방법이 99% 동일하니 생.략
'iOS' 카테고리의 다른 글
Swift - 구조체 또는 클래스의 프로퍼티 순차적으로 값 얻기 (0) | 2022.02.09 |
---|---|
Swift - gitignore 파일 추가로 중요한 파일 숨기기 (0) | 2022.02.09 |
SwiftUI - SwiftUI에서 UIkit View 가져오기 (0) | 2022.02.09 |
Swift - 남은 길이만큼 특정 문자로 채우기 (0) | 2022.02.09 |
Xcode 에서 option + click으로 assistant editor가 열리지 않을 때 (0) | 2022.02.09 |