[Objective-C] Swift 에서 사용할 함수의 첫번째 인자 이름 지정하기

Set first argument label in Objective C to use in Swift

naljin
7 min readAug 13, 2020

내가 옵젝씨 글을 쓰게되는 날이 올줄이야..^^🤦🏻‍♀️

우우우욱…

Swift 에서 인자 이름 지정하기

알다시피 Swift 에서는 argument label (함수 호출할 때 부르게 될 이름)이랑 parameter name (함수 안에서 사용할 이름) 따로 지정할 수 있슴둥!

func add(first operand1: Int, second operand2: Int) -> Int { 
return operand1 + operand2
}

여기서 first, second는 argument label 이 되고, operand1, operand2는 parameter name이 될테고, 아래처럼 호출할 수 있을 거예요.

add(first: 1, second: 2)

Objective C 에서 인자 이름 지정하기

자자 Objective C를 접한지 하루 된 저의 짧은 경험으로..! 위 코드를 대충 이렇게 옮길 수 있을듯요?

- (NSUInteger) add: (NSUInteger)operand1 second: (NSInteger) operand2 {   return operand1 + operand2;}

자자 하나씩 풀어 볼게요

잘 보이실랑가 모르겠지만 애초에 첫번째 인자의 이름(argument label)을 끼워넣을 만한데가 없어요.

그래서 해당 objc 함수를 Swift 에서 호출하면 이렇게 됩니다.

add(1, second: 2)
사실 내가 못하는걸테지만 옵젝씨 탓하고 보기

전치사를 이용한 첫번째 인자 이름 설정

‘나는 곧 죽어도 첫번째 인자를 끼워넣고 싶다고..!’ 라고 생각하시는 분 있나요? 바로 저예요. Swift에서 호출할때 첫번째 인자 이름이 보였으면 좋겠다고!!!!!!!!!!!!!!!!!!

그럴땐 전치사objc 함수 이름 끝에 붙여 넣어 봅시다. (더 밑 (Solution) 으로 내려보면 진짜 해결방법이 나옵니다!!)

- (NSUInteger) addToFirst: (NSUInteger)operand1 second: (NSInteger) operand2 {return operand1 + operand2;}

위랑 달라진건 함수 이름이 add 에서 addToFirst 로 바뀌었다는 거예요.

이제 Swift에서 호출해볼까요?

add(toFirst: 1, second: 2) 

짜잔! 함수 이름 일부분(뒤에 붙은 전치사 이후 부분)이 첫번째 인자 이름으로 넘어갔어요!

왜 이렇게 될까?!

저도 잘 몰라요. 그냥 그렇게 되더라고요…? (후비적) 구글링 해도 왜인지는 잘 모르겠으니까 설명해 주실 분 찾기 위해 쓰는 글입니다만..?^^

1. 왜 함수 이름에 전치사를 붙이면 Swift에서 첫번째 인자로 설정되나요?!

2. 전치사 말고 내가 원하는대로 설정할 수 있는 방법이 있나요?!!??!! (쩌렁쩌렁) -> 밑에 추가했어요!

맞아요. 이게 진짜 목적이에요. ㅎㅎ 뭐.. 그 전까지는 저도.. 이걸 보시는 여러분도 일단 아쉬운대로 전치사 붙여서 써야죠 뭐~~!! ㅎ…

일단 저는 그렇게 해결해나갈 예정입니다! ㅠ

Trouble Shooting

아니.. 그래서 전치사로 해결하고 있었거든요? 이렇게 말이죠!

// 함수 
- (void) makeRoundedWithCornerRadius: (CGFloat) cornerRadius;
// 실제 사용
self.makeRounded(withCornerRadius: 16)

이건 내 예상대로 Objective-C 함수 이름의 전치사 뒤부터가 Swift 의 first argument에 갖다가 잘 붙는데!

근데 이런 애들은 또 color label을 없애버리는거예요!!!

// 함수
- (void) makeBorderWithColor: (UIColor*) color width: (CGFloat) width;

// 실제 사용
self.makeBorder(with: .red, width: 10)

아니 대체 무슨 원리인데……… 님덜이 안알려준다면 남은건 stackoverflow 뿐이야…

구글 신들 믿습니다

Solution

저거 올린지 한시간은 지났나..? 바로 답변이 달렸어요..!

5252..믿고 있었다구!!

참고 링크까지 달아준 그는.. 도덕책..

요약하자면

Swift에서 사용할 API의 이름을 커스텀하기 위해선 NS_SWIFT_NAME 매크로를 사용하면 된다!

objc 함수를 Swift 에서 쓸때 첫번째 인자를 지정할 수 없어서 화가 났다면!

// objc func
- (void) makeRounded: (CGFloat) cornerRadius;
//use in swift
myView.makeRounded(16)

이렇게 함수 뒤에 NS_SWIFT_NAME(원하는 함수 모양) 을 붙여봅시다!

- (void) makeRounded: (CGFloat) cornerRadius NS_SWIFT_NAME(makeRounded(cornerRadius:));

저는 원래 함수 뒤에 NS_SWIFT_NAME(makeRounded(cornerRadius:)) 를 붙인 형태죠?

그래서 스위프트에서 호출하게 되면

myView.makeRounded(cornerRadius: 16)

흑흑… That’s what I want……………………….. Thank you……..

Swift ➡️ Objective-C 컨버팅 회고 🤢

  • Objective-C 읽기에 대한 거부감이 줄었다. 하지만 제약 사항 등을 더 알고나니 언어 자체에 대한 거부감은 늘어난 듯..?^^ C랑 비슷한 점이 많았다. 닉값인가?
  • 가아아아안단한 Objective-C 함수를 작성할 수 있게 되었다
  • Objective-C 에서 작성한 함수를 Swift에서 원하는 이름으로 사용 가능하도록 하는 NS_SWIFT_NAME 매크로를 알았다
  • StackOverFlow를 거의 보기만 했는데 질문도 남겨봤다. 원하던 답이 정확히 나온건 아니지만 그 과정에서 도움 받은 부분도 많아서 이후에는 그냥 막 올리게 되었다. 영어 실력이 는건가?ㅎ 튼 앞으로 질문을 더 쉽게 올리고 도움을 받을 수 있을 듯 하다

--

--

No responses yet