programing

Xcode 4.4 릴리즈 노트에 언급된 "Objective-C Literals"의 세부 사항은 무엇입니까?

newstyles 2023. 4. 19. 22:34

Xcode 4.4 릴리즈 노트에 언급된 "Objective-C Literals"의 세부 사항은 무엇입니까?

Xcode 4.4 릴리즈 노트를 확인하던 중 다음과 같은 사실을 알게 되었습니다.

LLVM 4.0 컴파일러

Xcode에는 다음과 같은 newObjective-C 언어 기능이 포함된 Apple LLVM 컴파일러 버전 4.0이 포함되어 있습니다.[...]
- Objective-C 리터럴: NSString 리터럴과 마찬가지로 NSAray, NSDictionary 및 NSNumber 리터럴 작성

나는 이 기능에 흥미를 느낀다.제가 알기론 어떻게 읽고 쓸 수 있는지는 잘 모르겠어요NSString작업 및 사용방법NSArray,NSDictionary,그리고.NSNumber.

자세한 내용은 무엇입니까?

http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and에서 말 그대로 복사:

목표 C 리터럴:NSArray, NSDictionary 및 NSNumber용 리터럴을 작성할 수 있게 되었습니다(NSString용 리터럴을 작성할 수 있는 것과 같음).

NSArray 리터럴

이전 이야기:

array = [NSArray arrayWithObjects:a, b, c, nil];

지금:

array = @[ a, b, c ];

NSDictionary 리터럴

이전 이야기:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];

지금:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

NS넘버 리터럴

이전 이야기:

NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];

지금:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;

[편집]

http://news.ycombinator.com/item?id=3672744의 zxoq는 새로운 서브스크립션을 추가했습니다.(리터럴과 함께 추가):

arr[1]      === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]

[편집 2]

새로운 ObjC 리터럴은 여러 WWDC 2012 세션에서 논의되었습니다.각 슬라이드의 파일명과 시간을 의도적으로 삭제하지 않았기 때문에, 당신이 원한다면 직접 찾을 수 있습니다.기본적으로는 이 투고에 기재되어 있는 것과 동일하지만, 이미지 위에 기재되어 있는 새로운 것도 몇 가지 있습니다.

이미지는 모두 크기 때문에 주의해 주십시오.다른 탭으로 끌어다 놓으면 원래 크기로 볼 수 있습니다.

리터럴 & 박스

[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]

리터럴 & 박스

@42
@10.8
@YES
@(6 + x * 2012)

컬렉션 서브스크립팅

[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]

컬렉션 서브스크립팅

@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]

@# 번호, @{} 사전, @" 문자열, @[] 배열, @() 식


이 부분은 새롭다.식 리터럴

표정이 있을 때(M_PI / 16예를 들어 괄호 안에 넣어야 합니다.

이 구문은 숫자 표현식, 부울, (C-) 문자열의 인덱스 검색, 부울 값, 열거 상수 및 문자열에 대해 작동합니다.

식 리터럴

NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)];

NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]];

NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]];

NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight];

NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")];

식 리터럴

NSNumber *piOverSixteen = @( M_PI / 16 );

NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );

NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSNumber *path = @( getenv("PATH") );

문자열 및 다음 리터럴 구문을 사용할 수 있는 방법 및 시기에 대한 자세한 내용은 다음과 같습니다.

박스 문자열 표현

NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

박스 문자열 표현

NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

어레이 리터럴 구조

어레이 리터럴 구조

// when you write this:
array = @[a, b, c ];

// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects) / sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

사전 리터럴 작동 방식

사전 리터럴 작동 방식

// when you write this:
dict = @{k1 : o1, k2 : o2, k3 : o3 };

// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects
                                   forKeys:keys
                                     count:count];

어레이 서브스크립션에 대한 상세

어레이 서브스크립팅

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = [_songs objectAtIndex:idx];
    [_songs replaceObjectAtindex:idx withObject:newSong];
    return oldSong;
}

어레이 서브스크립팅

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = _songs[idx];
    _songs[idx] = newSong;
    return oldSong;
}    

사전 첨자에 대한 자세한 정보

딕셔너리 첨자화

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = [_storage objectForKey:key];
    [_storage setObject:object forKey:key];
    return oldObject;
}

딕셔너리 첨자화

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = _storage[key];
    _storage[key] = newObject;
    return oldObject;
}

[편집 3]

Mike Ash는 이 새로운 문학작품에 대해 훌륭한 글을 쓰고 있다.자세한 내용은 꼭 확인하시기 바랍니다.


는 Objective-C 인스턴스의 을 가지고 .NSConstantString '클래스')__CFConstantString 좀 봐. 체크해 주세요.RewriteObjCStringLiteralclang 소스 코드로 기능합니다.컴파일러는 단순히 의 인스턴스 레이아웃과 일치하는 데이터를 내보냅니다.NSConstantString를 누릅니다

그대로는 몇 .NSArray ★★★★★★★★★★★★★★★★★」NSDictionary을 할 수 .즉, 서브 그 레이아웃의 합니다.이들은 리터럴 문자열에 대해 했던 것과 같은 작업을 할 수 있습니다. 즉, 컴파일러의 인스턴스 레이아웃(특수 서브 클래스용)을 하드 코드하고 해당 레이아웃의 데이터를 내보냅니다.또는 컴파일러가 런타임에 단순히 인스턴스를 생성하는 코드를 내보내도록 할 수도 있습니다.

"Objective-C Literals"에서

1)NSNumber,NSDictionary ★★★★★★★★★★★★★★★★★」NSArray리터럴은 Xcode 4.4로 제공됩니다.

2)NSDictionary ★★★★★★★★★★★★★★★★★」NSArray서브스크립트 작성에는 "Xcode 4.4 OS X 10.8 이후 SDK" 또는 "Xcode 4.5 및 iOS 6 이후 SDK"가 필요합니다.

서브스크립팅은 런타임 지원이 필요하기 때문에 iOS6 이전에는 작동하지 않을 것 같습니다.

Apple LLVM 4.0의 Objective-C의 목표입니다.★★★부터 합니다.at sign @

NS넘버 리터럴

NSNumber *someBool = [NSNumber numberWithBool:YES];
//BOOL literal
NSNumber *someBool = @YES;
     
NSNumber *someChar= [NSNumber numberWithChar:'a'];
//character literal
NSNumber *someChar = @'a';
     
NSNumber *someInt = [NSNumber numberWithInt:1];
NSNumber *someInt = [NSNumber numberWithUnsignedInt:1U];
NSNumber *someInt = [NSNumber numberWithLong:1L];
NSNumber *someInt = [NSNumber numberWithLongLong:1LL];
//integer literal
NSNumber *someInt = @1;
NSNumber *someInt = @1U;
NSNumber *someInt = @1L;
NSNumber *someInt = @1LL;
     
NSNumber *someFloat = [NSNumber numberWithFloat:3.141592654F];
NSNumber *someFloat = [NSNumber numberWithDouble:3.1415926535];
//float literal
NSNumber *someFloat = @3.141592654F;    
NSNumber *someFloat = @3.1415926535; 

컬렉션 리터럴

NSArray *someArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
//array literal
NSArray *someArray = @[ @"A", @"B", @"C" ];

NSDictionary *someDict = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"key1", @"value1",
                           @"key1", @"value2",
                           nil];
//dictionary literal
NSDictionary *someDict = @{ @"Character" : @"Zelda",
                         @"key1" : @"value2",
                         @"key2" : @value2 };

컬렉션 서브스크립팅

NSString *var1 = [someArray objectAtIndex:0]; // Returns 'A' 
NSString *var2 = [someDict objectForKey:@"key1"]; // Returns 'value1'
//Collection Subscripting
//read
NSString *var1 = someArray[0]; // Returns 'A'
NSString *var2 = someDict[@"key1"]; // Returns 'value1'
//write to mutable collection
someArray[0] = @"AA";
someDict[@"key1"] = @"value11";

상자형 식 - C-스타일 식을 목표 C로 변환합니다.숫자, 열거형, 구조체와 함께 작동

//Syntax @( <expression> )
[NSNumber numberWithInt:(INT_MAX + 1)];
//Boxed Expressions
NSNumber *var = @(INT_MAX + 1); 

언급URL : https://stackoverflow.com/questions/9347722/what-are-the-details-of-objective-c-literals-mentioned-in-the-xcode-4-4-releas