У меня есть некоторый код, который назначает объект общей переменной id, а затем выполняет различные действия в зависимости от класса, к которому принадлежит указанный объект (предположим, что каждый класс имеет соответствующее свойство, определенное и реализованное правильно):
id obj = #<this could be one of several things>#
id result;
if ([obj class] == [MyClass1 class])
{
result = [obj myProp1];
}
else if ([obj class] == [MyClass2 class])
{
result = [obj valueForKey:@"myProp2"];
}
else if ([obj class] == [MyClass3 class])
{
result = obj.myProp3; // this doesn't compile!
}
else
{
result = nil;
}
Что касается фрагментов MyClass1 и MyClass2, считается ли использование KVC более правильным или лучшим, чем просто отправка сообщения объекту напрямую в нединамических случаях (имя свойства является константой)?Использует ли метод KVC больше накладных расходов, поэтому его следует использовать только тогда, когда имя вызываемого свойства является динамическим?Я хотел бы получить представление о том, когда стоит использовать KVC.
Что касается фрагмента с MyClass3 - почему использование синтаксиса точки вызывает ошибку компиляции?Разве это не просто отправка получателю доступа сообщения, похожего на пример MyClass1?