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 클래스 .

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


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

1

에서 "목표 - C 리터럴"

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

2) NSDictionary및 NSArray아래 첨자에는 " Xcode 4.4 및 OS X 10.8 이상 SDK "또는 " Xcode 4.5 및 iOS 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.