2014-08-30 1 views
4

현재 내 프로젝트는 Swift 및 Objectice-C 언어를 모두 사용합니다. 그것을 작동 시키려면, official documentation의 지침을 따랐습니다. 이제 Objective-C에서 Swift를 사용할 수 있습니다. 그 반대의 경우도 마찬가지입니다.Objective C에서 오버로드 된 메서드를 사용하여 Swift Clases 사용

그러나 문제는 일부 Swift 클론에 오버로드 된 메소드가있을 때 발생합니다. Swift는 메서드 오버로드를 지원하지만 Objective-C는 지원하지 않습니다.

예 : 자동은 "동일한"서명 방법이 있기 때문에 컴파일 할 수 없습니다 파일 "MyNameProductModule-Swift.h"를 생성

func random(#lower: Int , upper: Int) -> Int { 
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) 
} 

func random(#lower: CGFloat , upper: CGFloat) -> CGFloat { 
    return CGFloat(arc4random() % 1)/0 
} 

.

질문 :

a) 중요한 것이 빠졌습니까?

b) 방법의 이름을 바꾸는 것 외에 다른 해결책이 있습니까?

c) Swift로 프레임 워크/라이브러리를 만들려면이 Framework/Library가 Objective C에서도 사용할 수 있도록 오버로드 된 메서드를 쓰지 않도록해야합니까?

감사합니다.

+1

충돌하는 방법의 예를 들려 줄 수 있습니까? – jtbandes

답변

5

.당신이 목표 C에서 모두 사용 계획하는 경우 0이 차별화 할 수 있습니다 당신이 모든 프로젝트의 당신 ObjC 측면에서 이것을 사용하려고하지 않는 경우

@objc(randomLoInt:HiInt:) 
func random(#lower: Int , upper: Int) -> Int { 
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) 
} 

@objc(randomLoFlt:HiFlt:) 
func random(#lower: CGFloat , upper: CGFloat) -> CGFloat { 
    return CGFloat(arc4random() % 1)/0 
} 

또는 바로 사용

@nonobjc 
func random(#lower: Int , upper: Int) -> Int { 
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) 
} 

@nonobjc 
func random(#lower: CGFloat , upper: CGFloat) -> CGFloat { 
    return CGFloat(arc4random() % 1)/0 
} 
5

a) 중요한 것이 빠졌습니까?

당신이

B하지 않음)의 모든 솔루션은 메소드의 이름을 변경 이외의 없습니까?

불행히도. 그러나 메서드를 구현 한 상태로 유지하고 Objective-C에 노출하기위한 목적으로 만 호출하는 두 개의 다른 함수를 추가 할 수 있습니다. 그런 식으로 Swift 코드는 여전히 메서드 오버로드 된 버전을 사용할 수 있습니다.

C) 내가 스위프트와 프레임 워크/라이브러리를 만들 경우, 나는이 프레임 워크/라이브러리가 너무 목표 C와 함께 사용하도록 설계되어있는 경우 오버로드 된 메서드를 작성하지 않는 관리 을해야합니까?

예, Objective-C와 Swift에서 모두 사용할 프레임 워크를 작성하려면 API가 Objective-C와 완전히 호환되는지 확인해야합니다. Objective-C와 호환되지 않는 다양한 Swift 기능이 있습니다. 내부적으로 프레임 워크에 사용할 수는 있지만 Objective-C에 공개 할 API의 일부로 사용할 수는 없습니다.

+0

그래서 노출되지 않기 때문에 'private'로 표시되면 Objective-C에서 컴파일됩니다. 그게 맞습니까? 그것들이 같은 표적에서 사용 되더라도? –

+0

기술적으로 @valbertos는 Objective-C로 컴파일되지 않습니다. Swift 파일은 항상 Swift 컴파일러로 컴파일되며 Objective-C 파일은 항상 Objective-C 컴파일러로 컴파일됩니다. 그러나 컴파일 된 Objective-C 및 Swift 코드는 상호 작용할 수 있습니다. 양방향에는 몇 가지 제한이 있습니다 (Swift는 Objective-C에는 메서드가있는 Enumeration, 메서드 오버로드 등이없는 반면 런타임에는 클래스를 수정하는 것과 관련된 속성과 메서드 Swizzling 등을 허용하지 않습니다) – drewag

0

Stanford University Swift 과정을 진행하는 동안이 동일한 문제가 발생했습니다. 그런 다음 아래 링크를 사용하여 솔루션을 발견했습니다. 여기서도 명확한 이해를 얻었습니다.

Stanford 과정은 이전 버전의 Swift와 Xcode가 있었고 Xcode가이 실수에 반응하지 않을 때 만들어졌습니다. 이 메소드를 오버라이드 할 수있는 것은 Xcode의 버그였습니다. 원하는 것을 얻기 위해 다른 이름으로 메소드를 작성해야합니다. swift2의로

https://www.reddit.com/r/swift/comments/34yusl/help_with_function_overloading/