0

this approach을 사용하여 문자열 상수를 함께 유지합니다.Objective-C 구조체를 사용할 때 takeRetainedValue 또는 takeUnretainedValue를 방지합니다.

MONExtResult.h 이것과 같이 오브젝티브 C에 사용할 수

const struct MONExtResultStruct MONExtResult = { 
    .AppID = @"appid", 
    .ErrorCode = @"errorcode", 
    .Progress = @"progress" 
}; 

struct MONExtResultStruct { 
    __unsafe_unretained NSString * const AppID; 
    __unsafe_unretained NSString * const ErrorCode; 
    __unsafe_unretained NSString * const Progress; 
}; 

extern const struct MONExtResultStruct MONExtResult; 

MONExtResult.m :

해당 게시물에서 동일한 예를 사용
NSString *str = MONExtResult.AppID; 

나는 그러나, 스위프트에서 사용하려고 할 때 : 나는 그것을 변환 후 unmanaged wrapper에서 값을 잡고해야하기 때문에

Cannot convert value of type 'Unmanaged<NSString>!' to expected argument type 'String'

이것은 :

let appID: String = MONExtResult.AppID 

... 나는 오류 String으로 :

let appID: String = MONExtResult.AppID.takeUnretainedValue() as String 

CF_IMPLICIT_BRIDGING_ENABLED 또는때와 수처럼 takeUnretainedValue를 호출의 필요성을 방지하기 위해 목표 - C 코드에 주석을 달 수있는 방법이 있나요 C 함수에 대한?

업데이트 : 상수는 Objective-C와 Swift 모두에서 액세스 할 수 있어야합니다. 그렇지 않으면 String 원시 값을 가진 신속한 enum을 사용합니다.

답변

0

내가 만들 수 있었던 가장 가까운 이것이다 :

enum MONExtResult: String { 
    case AppID = "com.me.myapp" 
    case ErrorCode = "game over" 
    case Progress = "vote Tuesday" 
} 

extension String { 
    init(const: MONExtResult) { 
     self = const.rawValue 
    } 
} 

let err = String(MONExtResult.ErrorCode) 

그것은이 작동하지 않는 것을 주목할 필요가 :

let appID: String = MONExtResult.AppID 

끝에 .rawValue 부족하지만, 너무 오래 거의 동일한 수의 문자와 약간 다른 구문을 기꺼이 받아들이 려하므로이 기능이 사용자가 염두에 두었던 것입니다.

+0

요구 사항 중 하나는 Objective-C와 Swift 모두에서 사용해야하기 때문에 Objective-C 구조체로 남아 있어야한다는 것입니다. Swift에서 열거 형을 만들면 원시 값 때문에 Objective-C 코드에서 액세스 할 수 없습니다. – Senseful

+0

사용 방법에 대한 예를 들어주십시오. Objective-C – Feldur

+0

안전하지 않은 모든 보존되지 않은 주석을 단순히 제거하면 어떻게됩니까? – Feldur