[Objective-C] Swift 에서 사용할 함수의 첫번째 인자 이름 지정하기
내가 옵젝씨 글을 쓰게되는 날이 올줄이야..^^🤦🏻♀️
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
저거 올린지 한시간은 지났나..? 바로 답변이 달렸어요..!
참고 링크까지 달아준 그는.. 도덕책..
요약하자면
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를 거의 보기만 했는데 질문도 남겨봤다. 원하던 답이 정확히 나온건 아니지만 그 과정에서 도움 받은 부분도 많아서 이후에는 그냥 막 올리게 되었다. 영어 실력이 는건가?ㅎ 튼 앞으로 질문을 더 쉽게 올리고 도움을 받을 수 있을 듯 하다