SORU
23 NİSAN 2013, Salı


Objective-C ve/karşılaştırma (bit maskesi-)ilan kontrol çeteleler

Kakao şöyle bir şey var, örneğin UIView bir oluşturabilirsiniz biliyor musun:

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Özel bir böyle enum tanımlanmış olan birden çok durum, 14* *var:

enum DownloadViewStatus {
  FileNotDownloaded,
  FileDownloading,
  FileDownloaded
};

Oluşturulan her bir küme için, tagonun kurdum: subview1.tag = FileNotDownloaded;

Daha sonra aşağıdaki: yok görünüm durumu için özel bir kanepe var

for (UIView *subview in self.subviews) {
  if (subview.tag == viewStatus)
    subview.hidden = NO;
  else
    subview.hidden = YES;
}

Amayapmaya çalıştığım şeybu izin için:

subview1.tag = FileNotDownloaded | FileDownloaded;

subview1 yani benim görüşüm iki devlet ortaya çıktı. Şu anda, | operatör iki numaralandırma değerleri ekleyin ettiğine göre bu iki durumdan birinde görünmüyor.

Bir şekilde bunu yapmak için var mı?

CEVAP
23 NİSAN 2013, Salı


Bitmasks İlan:

Mutlak değer atamak için alternatif olarak(, *, 4, *223...) bildirebilirsinizbitmasks(nasıl denir): bunun gibi

typedef enum : NSUInteger {
  FileNotDownloaded = (1 << 0), // => 00000001
  FileDownloading   = (1 << 1), // => 00000010
  FileDownloaded     = (1 << 2)  // => 00000100
} DownloadViewStatus;

ya da modern ObjC kullanarak 27*/NS_ENUM *makroları:

typedef NS_OPTIONS(NSUInteger, DownloadViewStatus) {
  FileNotDownloaded = (1 << 0), // => 00000001
  FileDownloading   = (1 << 1), // => 00000010
  FileDownloaded    = (1 << 2)  // => 00000100
};

(ikincisi hakkında daha fazla bilgi için Abizern's answer)

Bitmasks kavramı (genellikle) tek bit bir dizi ile, her numaralandırma değeri tanımlamak için.

Dolayısıyla ORıng iki değer aşağıdakileri yapar:

DownloadViewStatus status = FileNotDownloaded | FileDownloaded; // => 00000101

eşdeğerdir:

  00000001 // FileNotDownloaded
| 00000100 // FileDownloaded
----------
= 00000101 // (FileNotDownloaded | FileDownloaded)

Bitmasks Karşılaştırılması:

Bir şey bitmasks karşı kontrol akılda tutmak için:

Tam eşitlik için kontrol:

Diyelim ki durum böyle başlatıldı varsayalım:

DownloadViewStatus status = FileNotDownloaded | FileDownloaded; // => 00000101

status eğer kontrol etmek istersenizeşittir35 ** kullanabilirsiniz:

BOOL equals = (status == FileNotDownloaded); // => false

eşdeğerdir:

   00000101 // (FileNotDownloaded | FileDownloaded)
== 00000100 // FileDownloaded
-----------
=  00000000 // false

"Üyelik": kontrol ediyorum

Eğer status eğer kontrol etmek isterseniz sadeceiçerir39**, kullanmanız gerekir:

BOOL contains = (status & FileNotDownloaded) != 0; // => true

   00000101 // (FileNotDownloaded | FileDownloaded)
&  00000100 // FileDownloaded
-----------
=  00000100 // FileDownloaded
!= 00000000 // 0
-----------
=  00000001 // 1 => true

Bakın ince bir fark (ve neden geçerli bir "eğer"ifadesi muhtemelen yanlış)?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • Kupa World

    Kupa World

    1 EYLÜL 2011