swift 5 문법
[swift] 17. 연산자 재정의
jake-kim
2020. 9. 27. 02:16
1. precedencegroup 설정
precedencegroup ForwardApplication {
associativity: left // 왼쪽 연관성: 왼쪽에서 오른쪽으로 연산되게끔
// lowerThan: AdditionPrecedence // 의미: 덧셈을 먼저 처리
// higherThan: CastingPrecedence
}
infix operator |>: ForwardApplication
public func |> <A, B>(x: A, f: (A) -> B) -> B {
return f(x)
}
precedencegroup
스위프트는 그룹을 설정하여 우선순위를 정하기 때문에, 새로운 연산자에 대한 우선순위를 결정하기 위해 precedencegroup을 설정해야 함
infix
infix: 1+1
prefix: -3
postfix: 강제언랩핑 - textLabel.text!
2. 사용
x: input
f: transform(with:)라는 함수의 인풋은 (Input), 아웃풋은 Output
효과 -> 연산자를 사용하는 입장에서 가독성이 높고, 연산자를 사용해서 함수 안에서 input과 depencencies를 사용 할 수 있음
(사실상 연산자 없이 transfrom(with:, input:)하여 사용할 수 있음)
// 함수
func transform(with dependencies: Dependencies) -> (Input) -> Output {
...
}
// 사용
let output = input |> viewModel.transform(with: dependencies) {
return { input in
// 아래와 같이 사용가능
dependencies.()
input.()
return Output(init: )
}
}
* 함수 안에서 return해서 쓰는 이유: 반환하면, Input이 나오고 최종적으로 Output을 반환하므로