programing tip

Swift에서 Objective-C #define을 사용하는 방법

itbloger 2020. 11. 12. 07:59
반응형

Swift에서 Objective-C #define을 사용하는 방법


UIViewControllerSwift로 조금 훈련하기 위해 수업을 마이그레이션하고 있습니다. 브리징 헤더를 통해 Objective-C 코드를 성공적으로 사용하고 있지만 #define지시문 이 포함 된 상수 파일을 가져와야합니다 .

Cocoa 및 Objective-C (단순 매크로) 와 함께 Swift 사용 에서 다음을 보았습니다 .

간단한 매크로

일반적으로 #define지시어를 사용하여 C 및 Objective-C에서 기본 상수를 정의한 경우 Swift에서는 대신 전역 상수를 사용합니다. 예를 들어 상수 정의 #define FADE_ANIMATION_DURATION 0.35let FADE_ANIMATION_DURATION = 0.35. 단순한 상수와 유사한 매크로는 Swift 전역 변수에 직접 매핑되기 때문에 컴파일러는 C 및 Objective-C 소스 파일에 정의 된 간단한 매크로를 자동으로 가져옵니다.

그래서 가능한 것 같습니다. 상수가 포함 된 파일을 브리징 헤더로 가져 왔지만 .swift파일 에서 가시성이 없어 해결할 수 없습니다.

내 상수를 Swift에 표시하려면 어떻게해야합니까?

최신 정보:

NSString상수로 작동하는 것처럼 보이지만 부울로 는 작동 하지 않습니다.

#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift
#define kBOOL_CONSTANT YES // unresolved from swift

현재 일부 #define는 변환되고 일부는 변환되지 않습니다. 더 구체적으로:

#define A 1

...된다 :

var A: CInt { get }

또는:

#define B @"b"

...된다 :

var B: String { get }

불행하게도, YES그리고 NO인식과 스위프트 컴파일러에 의해 즉석에서 변환되지 않습니다.

#defines를 실제 상수 로 변환 하는 것이 좋습니다 #define. 어쨌든 s 보다 낫 습니다.

.h :

extern NSString* const kSTRING_CONSTANT;
extern const BOOL kBOOL_CONSTANT;

.미디엄

NSString* const kSTRING_CONSTANT = @"a_string_constant";
const BOOL kBOOL_CONSTANT = YES;

그리고 Swift는 다음을 볼 것입니다 :

var kSTRING_CONSTANT: NSString!
var kBOOL_CONSTANT: ObjCBool

또 다른 옵션은 BOOL정의를 다음과 같이 변경 하는 것입니다.

#define kBOOL_CONSTANT 1

더 빠르게. 그러나 실제 상수만큼 좋지는 않습니다.


위에서 몇 가지 사항에 대한 간단한 설명입니다.

Swift Constant는 키워드를 사용하여 표현됩니다.let

예를 들면 :

    let kStringConstant:String = "a_string_constant"

또한 프로토콜 정의에서만 {get}을 사용할 수 있습니다. 예 :

    protocol MyExampleProtocol {
        var B:String { get }
    }

신속하게 모든 클래스 또는 함수 외부에서 열거 형, 변수 또는 함수를 선언 할 수 있으며 특정 파일을 가져올 필요없이 모든 클래스에서 (전역 적으로) 사용할 수 있습니다.

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

  class UserLocationData : NSObject {    
class func getAllMonitoredRegions()->[String]{
     defaults.dictionaryForKey(kStringConstant)
 }

간단한 신속한 언어는 모든 #define 지시문 매크로가 필요하지 않습니다. let이되고 복잡한 매크로는 func로 변환되어야합니다.


매크로의 대안은 전역 변수 일 수 있습니다. 클래스 외부에서 전역 변수를 선언하고 클래스를 사용하지 않고도 액세스 할 수 있습니다. 아래에서 예를 찾으십시오.

import Foundation
let BASE_URL = "www.google.com"

class test {

}

참고 URL : https://stackoverflow.com/questions/24325477/how-to-use-a-objective-c-define-from-swift

반응형