Ваша проблема в том, что вы не понимаете C. Objective-C - это тонкий слой над C, который добавляет классы и обмен сообщениями.Проверьте хорошую книгу C, например одну из "The Definitive C Book Guide и List" .
Без получения ссылки на объект, который напечатан как UISlider *
, вы быневозможно использовать синтаксис свойства без, в каждом случае, приведения ссылки sender
к нужному типу, например, ((UISlider *)sender).value
.Даже если вы не использовали нотацию с точкой свойства, приведение также было бы необходимо, чтобы компилятор обрабатывал [slider value]
как возвращающий что-то отличное от id
.
Книга просто глупа,хоть.Нет требования, чтобы аргумент метода действия был напечатан как id
.Когда вы знаете, что отправитель всегда будет определенного типа - как в этом случае, когда код предполагает, что sender
всегда будет своего рода UISlider
- вы можете просто использовать этот тип в методеобъявление:
- (IBAction)sliderChanged:(UISlider *)sender
{
/* code */
}
Это лучше документирует намерение программиста - документацию, которую собирает Interface Builder, - а также полностью исключает необходимость выполнения приведения в методе.
В общем,если вам нужно выполнить Typecast, есть большая вероятность, что вы делаете что-то не так.
В качестве другого примера, давайте посмотрим на эту строку:
int progressAsInt = (int)(slider.value + 0.5f);
Здесь явный int
typecastне нужноПоскольку присваивание имеет значение int
l, значение с плавающей запятой, возникающее в результате сложения, обязательно будет приведено к int
как часть присваивания.