Xcode 4.4 sürüm notlarında belirtilen “Objective-C Literals” ın ayrıntıları nelerdir?


188

Ben Xcode 4.4 için sürüm notları geçiyordu ve bunu fark ettim:

LLVM 4.0 Derleyici

Xcode şimdi, aşağıdaki yeniObjective-C dil özellikleri de dahil olmak üzere Apple LLVM Derleyici sürüm 4.0'ı içeriyor: [...]
- Objective-C değişmez değerleri: NSString değişmezleriyle aynı NSArray, NSDictionary ve NSNumber için değişmez değerler oluşturma

Bu özellik beni ilgilendiriyor. Bu tamamen benim için ne kadar değişmezleri açık değil NSStringiş ve kimse onları kullanmak nasıl NSArray, NSDictionaryve NSNumber.

Detaylar nedir?


Bir cevap değil, ama burada bazı spekülasyonlar var: reddit.com/r/programming/comments/pso6x/xcode_43_released/…
Arjan Tijms

3
"Bu materyal bir NDA'ya tabi değil mi?" Ve sorunun mu?
Hejazzman

7
Hayır, Apple bu eklemelerin posta listesinde NDA olmadığını açıkça belirtti.
Mart'ta


3
İşte doğrudan Objective-C değişmezlerinin Clang tartışmasına bir bağlantı: clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

Yanıtlar:


393

Http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and adresinden kopyalanan kelimesi kelimesine :

Objective-C değişmez değerleri: Artık NSArray, NSDictionary ve NSNumber için değişmez değerler oluşturulabilir (tıpkı NSString için değişmez değerler oluşturabilir gibi)

NSArray Değişmezleri

Önceden:

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

Şimdi:

array = @[ a, b, c ];

NSDictionary Değişmezleri

Önceden:

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

Şimdi:

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

NSNumber Değişmez Değerler

Önceden:

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];

Şimdi:

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

[Düzenle]

zxoq de http://news.ycombinator.com/item?id=3672744 daha ilginç yeni Altsimgeleme eklemiştir. (Değişmez değerler ile eklendi):

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

[Düzenle 2]

Yeni ObjC hazır bilgileri birden fazla WWDC 2012 oturumunda tartışıldı . Kasıtlı olarak her slaydın dosya adlarını ve zamanını kaldırmadım, böylece isterseniz kendiniz bulabilirsiniz. Bunlar aslında bu yazıda belirtilenle aynı, ancak görüntülerin üzerinde bahsedeceğim birkaç yeni şey var.

Lütfen resimlerin büyük olduğunu unutmayın. Orijinal boyutlarında görüntülemek için bunları başka bir sekmeye sürüklemeniz yeterlidir

Değişmez Sayılar ve Boks

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

Değişmez Sayılar ve Boks

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

Koleksiyon Aboneliği

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

Koleksiyon Aboneliği

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

@ # sayı, @ {} sözlükler, @ "" dizeler, @ [] diziler, @ () ifadeler


Bu bölüm yeni. İfade Değişmezleri

Bir ifadeniz olduğunda ( M_PI / 16örneğin) ifadeyi parantez içine almalısınız.

Bu sözdizimi, sayısal ifadeler, booleans, (C-) dizesinde bir dizin bulma, boolean değerleri, enum sabitleri ve hatta karakter dizeleri için çalışır!

İfade Değişmezleri

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")];

İfade Değişmezleri

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

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

Karakter dizeleri ve bu değişmez sözdizimini nasıl / ne zaman kullanabileceğiniz hakkında daha fazla bilgi:

Kutulu Dize İfadeleri

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

Kutulu Dize İfadeleri

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

Dizi değişmezleri nasıl çalışır?

Dizi değişmezleri nasıl çalışır?

// 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];

Sözlük değişmezleri nasıl çalışır?

Sözlük değişmezleri nasıl çalışır?

// 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];

Dizi aboneliği hakkında daha fazla bilgi

Dizi Aboneliği

@implementation SongList {
    NSMutableArray *_songs;
}

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

Dizi Aboneliği

@implementation SongList {
    NSMutableArray *_songs;
}

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

Sözlük aboneliği hakkında daha fazla bilgi

Sözlük Aboneliği

@implementation Database {
    NSMutableDictionary *_storage;
}

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

Sözlük Aboneliği

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[Düzenle 3]

Mike Ash'in bu yeni değişmezler hakkında harika bir yazısı var. Bu şeyler hakkında daha fazla bilgi edinmek istiyorsanız, kontrol ettiğinizden emin olun .



9
Kodlamamın hızlandığını görebiliyorum!
Pedro Mancheno

12
Bu yeni gösterimleri desteklemek için xCode 4.3 almanın herhangi bir yolu var mı? Onları istiyorum - ŞİMDİ ... ama onlar için "dağa çıkmak" ÇOK değilim ...
Alex Gray

20
Burada, resimlere gömülü, düz metin olarak yayınlandıysa bir arama motoru tarafından daha kolay anlaşılabilecek çok sayıda metin içeriğiniz var.
Kertenkele Bill

5
@ BillillLizard Saygılarımla katılmıyorum. Testin çoğu ya un-aranabilir şeyler gibi olduğu {ve [ya benzeri jenerik kelimelerdir array, idve @implementation. İlgili anahtar kelimeler literal, objcve xcodedeğil belirli bahseder, [ya @implementation. Bu sorunun Google'daki genel ObjC sorgularında görünmesini istemezsiniz, yalnızca şu objc literalanda gerçekleşen bir sorgu olduğunda (başlık ve etiketler sayesinde) gösterilmelidir.
Pooria Azimi

4
Şimdi buna StackOverflow yanıtı denir. İyi iş Pooria.
Nitish

15

Objective-C derleyicisi, NSConstantStringsınıfın, yani sınıfın örneklerinin bellek düzeni hakkında sabit kodlanmış bilgiye sahiptir __CFConstantString. Clang kaynak kodundaki RewriteObjCStringLiteralişlevi kontrol edin lib/Rewrite/RewriteModernObjC.cpp. Derleyici, NSConstantStringsınıfın örneklerinin düzeniyle eşleşen verileri yayar .

Değişmez değerler NSArrayve NSDictionaryörnekler için birkaç olasılık vardır . Değişmez dizeler için yaptıkları gibi bir şey yapabilirler - derleyicideki örnek düzenini (özel bir alt sınıf için) sabit kodlayabilir ve bu düzende veri yayabilirler. Veya derleyicinin çalışma zamanında bir örnek oluşturan kod yayınlamasını sağlayabilirler.


2
Nesne değişmezi sözdizimi uygulanması NSArrayve NSDictionaryoldukça bu benzemez NSString. Derleyici sadece çalışma zamanında NSDictionaryveya NSArrayzamanında bir çağrı oluşturur . Bu nedenle global değişkenler bu sözdizimi kullanılarak başlatılamaz (aksine NSString). Bu, sonucun bir derleme zaman sabiti olmasını gerektirir.
Buzzy

1

Gönderen “Objective-C rakamları”

1) NSNumber, NSDictionaryve NSArrayhazır bilgi mevcuttur Xcode 4.4 .

2) NSDictionaryve NSArrayabonelik için " Xcode 4.4 ve OS X 10.8 veya üzeri SDK " veya " Xcode 4.5 ve iOS 6 veya üstü SDK " gerekir

Bana abonelik için çalışma zamanı desteğine ihtiyaç duyuyor gibi görünüyor ve bu nedenle iOS6'dan önce çalışmaz .


aynı makalede, 'iOS dağıtımı' sütununda "iOS 4'e geri
dağılıyor

1
Xcode 4.5 ile derlediğim bir projede yanlışlıkla dizi değişmezleri kullandım. İOS5 çalıştıran bir iPad'de sorunsuz çalışır. Xcode 4.2'de derlenmiyor, bu yüzden yaptığımı öğrendim.
JScarry

Abonelik, bir başlık eklerseniz Xcode 4.4 ve birlikte verilen iOS5 SDK ile çalışmak için yapılabilir: github.com/tewha/iOS-Subscripting/blob/master/…
Steven Fisher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.