Существует ли эквивалент динамическому броску C++ в Objective C?

 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

Преобразование любого данного Типа массива для Строкового представления функции потока Java 8 использования

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());
5
задан Douglas Mayle 3 September 2009 в 15:41
поделиться

4 ответа

Вы можете добавить категорию в NSObject, чтобы добавить нужную вам функциональность.

//NSObject+DynamicCast.h
@interface NSObject (DynamicCast)
-(id)objectIfMemberOfClass:(Class)aClass;
@end

//NSObject+DynamicCast.m
@implementation NSObject (DynamicCast)
-(id)objectIfMemberOfClass:(Class)aClass;
{
  return [self isMemberOfClass:aClass] ? self : nil;
}
@end

Затем вы можете сделать это:

SuperClass *super = [[SuperClass alloc] init];
SubClass *sub = [[SubClass alloc] init];
SubClass *sub_pointer;
id generic_pointer;

// **The nice one-line cast below**
sub_pointer = [super objectIfMemberOfClass:[SubClass class]];
// Prints NO
printf("Is a subclass: %s\n", sub_pointer ? "YES" : "NO");

sub_pointer = [sub objectIfMemberOfClass:[SubClass class]];
// Prints YES
printf("Is a subclass: %s\n", sub_pointer ? "YES" : "NO");
4
ответ дан 13 December 2019 в 19:31
поделиться

Мне пришло в голову, что я могу использовать тернарный оператор, чтобы поместить все это в одну строку, но это все равно немного беспорядок:

SuperClass *super = [[SuperClass alloc] init];
SubClass *sub = [[SubClass alloc] init];
SubClass *sub_pointer;

// One line, but still a bit wordy
sub_pointer = [super isMemberOfClass:[SubClass class]] ? (SubClass*) super : nil;
// Logs NO
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");

sub_pointer = [sub isMemberOfClass:[SubClass class]] ? (SubClass*) sub : nil;
// Logs YES
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");

Если я получаю обратно заданную переменную из функции, мне придется кэшировать его в переменной id, чтобы эта версия работала.

SubClass *sub_pointer;
id generic_pointer;

// One line, but still a bit wordy
generic_pointer = (id) mySuperFunc();
sub_pointer = [generic_pointer isMemberOfClass:[SubClass class]] ? generic_pointer : nil;
// Logs NO
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");

generic_pointer = (id) mySubFunc();
sub_pointer = [generic_pointer isMemberOfClass:[SubClass class]] ? generic_pointer : nil;
// Logs YES
NSLog(@"Is a subclass: %@", sub_pointer ? @"YES" : @"NO");
0
ответ дан 13 December 2019 в 19:31
поделиться

в основном ..

id sub_pointer = [foo isMemberOfClass:AClass] ? foo : nil;
NSLog(@"Is a subclass: %i", sub_pointer!=nil ); 

не кажется более многословным.

0
ответ дан 13 December 2019 в 19:31
поделиться

Я использую макрос:

#define DYNAMIC_CAST(x, cls)                                \
  ({                                                        \
    cls *inst_ = (cls *)(x);                                \
    [inst_ isKindOfClass:[cls class]] ? inst_ : nil;        \
  })

Я отчасти предпочитаю использовать категорию в NSObject, потому что возвращаемый объект имеет правильный тип (а не id), хотя я понимаю, что в большинстве случаев вы в любом случае просто присвоим его переменной того же типа.

4
ответ дан 13 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: