Ищите лучший способ проверить тип класса объекта - PullRequest
1 голос
/ 22 декабря 2010

При использовании Scripting Bridge с Excel, когда я получаю значение одной ячейки, я не знаю, какой класс я собираюсь получить из этой ячейки. Пока диапазон из одной ячейки возвращает NSString или NSNumber (диапазон из нескольких ячеек всегда возвращает NSArray, и мне нужно оттуда привести значения). В своей работе я обычно хочу только значение string для ячейки, поэтому для приведения значения диапазона в одну ячейку к необходимому мне я делаю это ...

NSString *cellValue = [targetRange.value get];
if ([cellValue isKindOfClass:[NSString class]]) {
    cellValue = [targetRange.value get];
} else if ([cellValue isKindOfClass:[NSNumber class]]) {
    cellValue = [[targetRange.value get] stringValue];
}

Моя проблема связана с первой строкой (пока мы будем игнорировать третью строку, поскольку я все еще занимаюсь рефакторингом). Будет ли лучший класс, чтобы захватить значение ячейки для проверки класса? Эти последние три строки работают хорошо, но я не совсем комфортно это делаю; это кажется не интуитивно понятным, но идти с NSObject кажется таким же странным.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2010

кажется не интуитивным, но с NSObject кажется таким же странным.

В таких случаях вы можете использовать id:

Тип идентификатора полностью неограничен.Сам по себе он не дает никакой информации об объекте, за исключением того, что это объект.

Например:

id cellValue = [targetRange.value get];
NSString *stringValue = nil;
if ([cellValue isKindOfClass:[NSString class]]) {
    stringValue = cellValue;
} else if ([cellValue isKindOfClass:[NSNumber class]]) {
    stringValue = [cellValue stringValue];
}

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

NSString *stringValue = [NSString stringWithFormat:@"%@", [targetRange.value get]];
1 голос
/ 22 декабря 2010

Вы спрашиваете, "нормально" или "нормально" проверять класс объекта во время выполнения и действовать по-разному в зависимости от класса? Если так, то это решительный да - это часть того, что делает Objective-C таким мощным.

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

...