Swift 사용자 지정 연산자 — 3의 규칙

5263 단어 swiftios


모든 응용 프로그램에서 아마도 가장 많이 사용되는 수학 연산이기 때문에 언어로 이와 같은 것을 만들겠다는 아이디어를 항상 가지고 있었습니다. 비례 문제에서 알 수 없는 데이터를 계산하기 위해 종이에 이 그래프를 그리던 수학 수업 시간을 기억합니다.



그렇다면 이것이 Swift에서 어떻게 생성될 수 있을까요? 먼저 정리하자면 위의 코드는 일부 코드 서식이 있는 것처럼 보입니다.
이것이 없다면 코드는 다음과 같을 것입니다.

let x = 0.8 -->? 0.4 --> 10


보시다시피 서식과 물음표는 우리가 계산하는 값을 이해하는 데 유용하며 실제로 이것은 하나의 사용자 지정 연산자가 아니라 수학 연산을 형성하는 두 개의 사용자 지정 연산자라는 것을 알 수 있습니다. 기호 -->->가 Swift에서 예약된 기호이기 때문에 사용되었습니다.

그래서 첫 번째 생각은 맞춤형 삼항 연산자를 만드는 것이었지만 적어도 현재로서는 Swift에서 불가능합니다. 우리가 할 수 있는 것은 두 개의 사용자 지정 연산자를 만드는 것입니다. --> 는 매우 간단합니다. 왼쪽 값과 오른쪽 값을 튜플링하여 (Double, Double) 를 반환합니다. -->? 연산자는 모든 값을 가지고 있기 때문에 수학 계산을 수행하는 연산자입니다. 그것은 Double 연산자가 정확히 무엇인지 튜플 () -> (Double, Double)을 반환하는 폐쇄 함수 왼쪽과 오른쪽에 --> 값을 받습니다.

infix operator -->?: TernaryPrecedence

func -->?(lhs: Double,
          rhs: @escaping @autoclosure () -> (Double, Double)
) -> Double {
    return lhs * rhs().1 / rhs().0
}

infix operator -->

func -->(lhs: Double, rhs: Double) -> (Double, Double) {
    return (lhs, rhs)
}

let x = 0.8 -->?
        0.4 --> 10


https://github.com/nuno-vieira/RuleOf3-CustomOperator-Swift-Playground

분석해 보겠습니다.





이 연산자는 설명이 필요 없으며, Double lhs(왼쪽) 인수와 또 다른Double rhs(오른쪽) 인수를 사용하여 튜플로 반환합니다(이 경우에는 (0.4, 10) ). 그것은 두 대상에서 작동하기 때문에 중위 연산자이므로 왼쪽 및 오른쪽 인수가 있는 이유입니다. 그리고 우선 순위 그룹을 지정하지 않았기 때문에 여러 작업을 연결하는 데 관심이 없기 때문에 연관성이 없는 기본 그룹이 있습니다.

→?



여기에서 모든 마법이 일어납니다 🧙‍♂️✨. 그것은 또한 중위 연산자입니다. 여기서 lhs 인수에는 알 수 없는 비율로 알고 싶은 값이 있고 rhs에서는 함수를 인수로 받습니다. 나중에 호출하여 알려진 비례 값이 있는 튜플을 제공할 수 있습니다. --> 키워드는 중괄호 없이 클로저를 작성할 수 있도록 하는 데 중요합니다. 그렇지 않으면 최종 표현식이 대신 다음과 같이 표시됩니다.

let x = 0.8 -->? { 0.4 -> 10 }

@autoclosure는 우리가 원하는 오른쪽 결합성을 가지고 있으므로 오른쪽 표현식이 먼저 평가됩니다.

결론



Swift는 Custom Operators로 우리가 매우 창의적이 되도록 했습니다. 이 연산자를 만드는 것은 정말 즐거웠습니다. 하지만 물론 코드베이스에서 고객 연산자를 사용하기로 결정할 때, 특히 여러 개발자로 구성된 팀에서 작업할 때 주의해야 합니다. 우리는 코드베이스를 가능한 한 단순하게 만들고 싶고, 사용자 지정 연산자를 도입하는 것은 신규 사용자를 온보딩하기 더 어려울 것입니다. 우리가 매우 특정한 문제에 대한 DSL을 구축하지 않거나 특정 도메인의 코드베이스를 분명히 개선할 사용자 지정 연산자가 아닌 경우 사용자 지정 연산자를 과도하게 사용하지 않을 것입니다.

좋은 웹페이지 즐겨찾기