programing

목표 C의 상수

muds 2023. 4. 16. 15:57
반응형

목표 C의 상수

코코아 어플리케이션을 개발하고 있는데 상수를 사용하고 있어요.NSStrings는 내 기본 설정의 키 이름을 저장하는 방법으로 사용됩니다.

필요한 경우 키를 쉽게 바꿀 수 있기 때문에 좋은 아이디어라고 생각합니다.
또한 '데이터와 논리를 분리한다'는 개념도 있습니다.

어쨌든, 이러한 상수를 애플리케이션 전체에 대해 한 번 정의할 수 있는 좋은 방법이 있을까요?

분명 쉽고 지능적인 방법이 있을 거예요. 하지만 지금 제 수업은 그저 그들이 사용하는 방법을 재정의하고 있어요.

다음과 같은 헤더 파일을 생성해야 합니다.

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

할 수 .externFOUNDATION_EXPORTC/C++ 혼재 환경 또는 다른 플랫폼에서 코드를 사용하지 않는 경우)

이 파일은 상수를 사용하는 각 파일 또는 프로젝트의 미리 컴파일된 헤더에 포함할 수 있습니다.

라고 하는 것은요, 상수를 하는 것입니다..m다음과 같이 합니다.

// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

Constants.m최종 제품에 링크할 수 있도록 어플리케이션/프로세서 타겟에 추가해야 합니다.

" "가 아닌 #define'd 상수'는비교('d ㄴ')를 사용하여 할 수 상수입니다.stringInstance == MyFirstConstant은 현악기 속도입니다.[stringInstance isEqualToString:MyFirstConstant] (「IMO」).

가장 쉬운 방법:

// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"

더 나은 방법:

// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";

두 번째 장점은 상수 값을 변경해도 전체 프로그램이 재구축되지 않는다는 것입니다.

이치노릇을 하다 않은 상수가 는, 「」를 사용해 .static키워드를 지정합니다.

// In your *.m file
static NSString * const kNSStringConst = @"const value";

그유 the the because because 。static계속하다


@QuinTaylor 의한 마이너 보정: 정적 변수는 컴파일 유닛 내에서 볼 수 있습니다.보통 이것은 (이 예시와 같이) 단일 .m 파일입니다만, 컴파일 후에 링커 에러가 발생하기 때문에, 다른 헤더로 선언하면 문제가 발생할 수 있습니다.

승인된 (올바른) 답변에는 "이 [Constants.h]파일을 포함할 수 있습니다.프로젝트 사전 준비 헤더에 추가해 주세요."

저는 초보자로서 더 이상의 설명 없이 이 작업을 수행하는 데 어려움을 겪었습니다. 다음과 같은 방법이 있습니다.YourAppNameHere-Prefix.pch 파일(이것은 Xcode의 미리 컴파일된 헤더의 기본 이름)에서 블록 내부에 상수.h를 가져옵니다.

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

또한 Constant.h 및 Constant.m 파일에는 허용된 답변에 설명된 내용 이외에는 다른 내용이 전혀 포함되어 있지 않습니다(인터페이스 또는 구현 없음).

나는 일반적으로 Barry Wark와 Rahul Gupta가 게시한 방법을 사용한다.

단, .h 파일과 .m 파일 모두 같은 단어를 반복하는 것은 좋아하지 않습니다.다음 예제에서는 두 파일의 행이 거의 동일합니다.

// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";

그래서 제가 하고 싶은 일은 C 프리프로세서 기계를 사용하는 것입니다.예를 들어 설명하겠습니다.

.STR_CONST(name, value):

// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif

상수를 정의하는 .h/.m 쌍으로 다음 작업을 수행합니다.

// myfile.h
#import <StringConsts.h>

STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"

et voila, 나는 상수에 대한 모든 정보를 .h 파일에만 가지고 있다.

나 자신은 다음과 같은 프리퍼런스에 사용되는 상시 NSString을 선언하기 위한 전용 헤더를 가지고 있습니다.

extern NSString * const PPRememberMusicList;
extern NSString * const PPLoadMusicAtListLoad;
extern NSString * const PPAfterPlayingMusic;
extern NSString * const PPGotoStartupAfterPlaying;

그런 다음 부속된 .m 파일에서 선언합니다.

NSString * const PPRememberMusicList = @"Remember Music List";
NSString * const PPLoadMusicAtListLoad = @"Load music when loading list";
NSString * const PPAfterPlayingMusic = @"After playing music";
NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing";

이 접근방식은 나에게 큰 도움이 되었다.

편집: 문자열이 여러 파일에서 사용되는 경우 이 방법이 가장 적합합니다. 경우는, 「」를 할 수 .#define kNSStringConstant @"Constant NSString"m이합니다.m 일 m m m m m m m m m m m m m

@Kriz의 제안을 약간 수정하여 정수 헤더파일이 PCH에 포함되어 있는 경우 정상적으로 동작하도록 합니다.이것은 지극히 정상적인 것입니다. Import에 .m파일을 작성하면 기호가 표시되지 않고 링커가 불만족스러워집니다.

다만, 다음의 변경에 의해서 동작할 수 있습니다.좀 복잡하긴 하지만 효과가 있어요.

3개의 파일이 필요하겠지만.h되어 있는 , " " " " " "」의 파일,.h 및 「」를 참조해 주세요..m 파일, 파일 사용하겠습니다.ConstantList.h,Constants.h ★★★★★★★★★★★★★★★★★」Constants.m내용Constants.h음음음같 뭇매하다

// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"

Constants.m을 사용하다

// Constants.m
#ifdef STR_CONST
    #undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"

★★★★★★★★★★★★★★★★★★★.ConstantList.h파일입니다.그게 전부입니다.

// ConstantList.h
STR_CONST(kMyConstant, "Value");
…

몇 가지 주의사항:

  1. 를 다시 안 되었습니다..m 줄지어 쫓다 #undef매크로를 사용하기 위해서 입력해 주세요.

  2. 그리고 또 제가 쓰는 대신해서#import컴파일러가 이전에 컴파일된 값을 보지 않도록 합니다.

  3. 값을 변경할 때마다 PCH(및 프로젝트 전체)를 다시 컴파일해야 합니다.이러한 값은 정상적으로 분리(복제)된 경우에는 해당되지 않습니다.

그것이 누군가에게 도움이 되기를 바랍니다.

// Prefs.h
extern NSString * const RAHUL;

// Prefs.m
NSString * const RAHUL = @"rahul";

Abizer가 말한 것처럼 PCH 파일에 넣을 수 있습니다.다른 방법은 모든 키에 대한 포함 파일을 만든 다음 사용 중인 파일에 포함하거나 PCH에 포함시키는 것입니다.자체 include 파일에 이러한 상수를 모두 찾고 정의할 수 있는 장소가 적어도 하나 이상 있습니다.

글로벌 상수와 같은 것을 원하는 경우, 빠르고 더러운 방법은 상수 선언을 에 넣는 것입니다.pch파일.

네임스페이스 상수를 좋아하는 경우 구조를 활용할 수 있습니다.2011-08-19 금요일 Q&A: Namesthed 상수함수

// in the header
extern const struct MANotifyingArrayNotificationsStruct
{
    NSString *didAddObject;
    NSString *didChangeObject;
    NSString *didRemoveObject;
} MANotifyingArrayNotifications;

// in the implementation
const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = {
    .didAddObject = @"didAddObject",
    .didChangeObject = @"didChangeObject",
    .didRemoveObject = @"didRemoveObject"
};

클래스 메서드를 사용해 보십시오.

+(NSString*)theMainTitle
{
    return @"Hello World";
}

가끔 사용해요.

저는 싱글톤 클래스를 사용하여 수업을 비웃고 테스트에 필요한 경우 상수를 변경할 수 있습니다.상수 클래스는 다음과 같습니다.

#import <Foundation/Foundation.h>

@interface iCode_Framework : NSObject

@property (readonly, nonatomic) unsigned int iBufCapacity;
@property (readonly, nonatomic) unsigned int iPort;
@property (readonly, nonatomic) NSString * urlStr;

@end

#import "iCode_Framework.h"

static iCode_Framework * instance;

@implementation iCode_Framework

@dynamic iBufCapacity;
@dynamic iPort;
@dynamic urlStr;

- (unsigned int)iBufCapacity
{
    return 1024u;
};

- (unsigned int)iPort
{
    return 1978u;
};

- (NSString *)urlStr
{
    return @"localhost";
};

+ (void)initialize
{
    if (!instance) {
        instance = [[super allocWithZone:NULL] init];
    }
}

+ (id)allocWithZone:(NSZone * const)notUsed
{
    return instance;
}

@end

그리고 다음과 같이 사용됩니다(상수 c에 대한 줄임말 사용 - 입력이 절약됩니다).[[Constants alloc] init]( ) :

#import "iCode_FrameworkTests.h"
#import "iCode_Framework.h"

static iCode_Framework * c; // Shorthand

@implementation iCode_FrameworkTests

+ (void)initialize
{
    c  = [[iCode_Framework alloc] init]; // Used like normal class; easy to mock!
}

- (void)testSingleton
{
    STAssertNotNil(c, nil);
    STAssertEqualObjects(c, [iCode_Framework alloc], nil);
    STAssertEquals(c.iBufCapacity, 1024u, nil);
}

@end

하고 싶은 NSString.newLine;목표 c에서 정적 상수여야 하는 경우 다음과 같은 것을 빠르게 만들 수 있습니다.

public extension NSString {
    @objc public static let newLine = "\n"
}

또한 읽기 쉬운 상수 정의도 있고, 선택한 유형 내에서 사용할 수 있으며, 스타일도 유형의 컨텍스트로 제한됩니다.

언급URL : https://stackoverflow.com/questions/538996/constants-in-objective-c

반응형