Xcode 4.4 릴리스 정보에 언급 된“Objective-C Literals”의 세부 사항은 무엇입니까?


188

Xcode 4.4의 릴리스 정보를 살펴 보았으며 다음과 같이 나타났습니다.

LLVM 4.0 컴파일러

Xcode는 이제 다음과 같은 새로운 Objective-C 언어 기능을 포함하여 Apple LLVM Compiler 버전 4.0을 포함합니다. [...]
-Objective-C 리터럴 : NSString의 리터럴과 동일한 NSArray, NSDictionary 및 NSNumber의 리터럴 생성

이 기능에 관심이 있습니다. 그것은 전적으로 나에게 위해 얼마나 리터럴 분명하지 않다 NSString작업을 한 그들에 어떻게 활용할 수 있는지 NSArray, NSDictionary하고 NSNumber.

세부 사항은 무엇입니까?


아니 대답은,하지만 몇 가지 추측은 여기있다 : reddit.com/r/programming/comments/pso6x/xcode_43_released/...은
Arjan Tijms

3
"이 자료는 NDA에 해당되지 않습니까?" 그리고 당신의 문제는?
Hejazzman 2012

7
아니요, Apple은 이러한 추가 사항이 메일 링리스트의 NDA가 아니라고 명시 적으로 말했습니다.
griotspeak

2
LLVM은 이것에 관한 몇 가지 문서를 가지고 있습니다 : clang.llvm.org/docs/LanguageExtensions.html#objc_lambdas
Steven Kramer

3
다음은 Objective-C 리터럴에 대한 Clang 토론에 대한 링크입니다. clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

답변:


393

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

Objective-C 리터럴 : 이제 NSArray, NSDictionary 및 NSNumber에 대한 리터럴을 작성할 수 있습니다 (NSString에 대한 리터럴을 작성할 수있는 것처럼).

NSArray 리터럴

이전 :

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

지금:

array = @[ a, b, c ];

NS 사전 리터럴

이전 :

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

지금:

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

NSNumber 리터럴

이전 :

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 는이 새로운 리터럴에 대한 훌륭한 글을 썼습니다. 당신이 더 많은이 물건에 대해 알고 싶다면,해야합니다 그것을 확인 .



9
코딩 속도가 빨라지는 것을 볼 수 있습니다!
Pedro Mancheno

12
이 새로운 표기법을 지원하기 위해 xCode 4.3을 얻는 방법이 있습니까? - 내가 그들을 원하는 NOW ...하지만하고 그래서 그들을 위해 ... "산 올라가고"하지
알렉스 그레이

20
검색 엔진이 일반 텍스트로 게시 된 경우 검색 엔진에서보다 쉽게 ​​찾을 수있는 이미지에 텍스트 콘텐츠가 많이 포함되어 있습니다.
Bill 도마뱀

5
@BilltheLizard 나는 정중하게 동의하지 않습니다. 테스트의 대부분은 하나되지 않은 검색 일들이처럼 {하고 [, 또는 같은 일반적인 단어는 array, id@implementation. 관련 키워드는 literal, objc그리고 xcode이 아닌 특정는 언급 된, [또는 @implementation. 이 질문이 Google의 일반적인 ObjC 검색어에 대해 표시되지 않게 objc literal하려면 현재 검색어 (제목 및 태그 덕분에)가 발생하는 누군가 조회 할 때만 표시되어야합니다 .
Pooria Azimi

4
이제 이것을 StackOverflow 답변이라고합니다. 잘 했어 Pooria.
Nitish

15

Objective-C 컴파일러는 NSConstantString클래스 (일명 클래스) 의 메모리 레이아웃에 대한 지식을 하드 코딩했습니다 __CFConstantString. clang 소스 코드에서 RewriteObjCStringLiteral함수를 확인하십시오 lib/Rewrite/RewriteModernObjC.cpp. 컴파일러는 단순히 인스턴스의 레이아웃과 일치하는 데이터를 방출합니다.NSConstantString 클래스 .

리터럴 NSArrayNSDictionary인스턴스 에는 몇 가지 가능성이 있습니다 . 컴파일러에서 리터럴 문자열에 대한 작업 (특수 서브 클래스의 경우)을 하드 코딩하고 해당 레이아웃에서 데이터를 생성하는 것과 같은 작업을 수행 할 수 있습니다. 또는 런타임에 컴파일러가 단순히 인스턴스를 생성하는 코드를 생성하도록 할 수도 있습니다.


2
에 대한 개체 리터럴 구문의 구현 NSArray과는 NSDictionary확실히 그와는 달리입니다 NSString. 컴파일러는 단순히를 호출 생성 NSDictionary또는 NSArray런타임을. 이것이 또한 (와 달리 NSString) 이 구문을 사용하여 전역 변수를 초기화 할 수없는 이유 입니다. 결과는 컴파일 타임 상수 여야합니다.
Buzzy

1

에서 "목표 - C 리터럴"

1) NSNumber, NSDictionaryNSArray리터럴에서 사용할 수있는 엑스 코드 4.4 .

2) NSDictionaryNSArray아래 첨자에는 " Xcode 4.4OS X 10.8 이상 SDK "또는 " Xcode 4.5iOS 6 이상 SDK "

아래 첨자에 런타임 지원이 필요하므로 iOS6 이전에는 작동하지 않는 것 같습니다 .


같은 기사에서 'iOS 배포'열에 "iOS 4로 다시 배포"라고
표시됨

1
실수로 Xcode 4.5로 컴파일 한 프로젝트에서 배열 리터럴을 사용했습니다. iOS5를 실행하는 iPad에서 제대로 실행됩니다. Xcode 4.2에서는 컴파일되지 않았으므로 Xcode 4.2에서 컴파일했습니다.
JScarry

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.