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, tag
onun 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
Bitmasks İlan:
Mutlak değer atamak için alternatif olarak(, *, 4
, *2
23...) 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ış)?
İçinde Objective-C neden = [super init...
Objective-C switch deyimi içinde değiş...
::standart bir dize karşılaştırma (diz...
Objective-C - eğer bir yöntem varsa ko...
Objective-C çalışma Zamanı: en iyi sın...