dat$e <- rowSums(dat[,c("b", "c")], na.rm=TRUE)
dat
# a b c d e
# 1 1 2 3 4 5
# 2 5 NA 7 8 7
Хотя это законно, я не понимаю, почему это требуется в описанном вами случае (и это уродливое решение). Почему вы не можете просто вызвать:
[dealie setFrognatz:[NSColor plaidColor]];
Если вы обычно не предоставляете -setFrognatz:
, просто сделайте его частным методом, объявив его внутри .m, но над этим определением функции. (В данном случае не имеет значения, находится ли он в блоке @implementation
.)
@interface BWOblateSphereoid ()
- (void)setFrognatz:(NSColor *)acolor
@end
@implementation OblateSphereoid
void drawEggThunk (DrawingContext *context, Rect areaToDraw, void *userData)
{
BWOblateSphereoid *dealie = (BWOblateSphereoid *)userData;
[dealie setFrognatz:[NSColor plaidColor]];
// and more stuff.
} // drawEggThunk
...
@end // OblateSphereoid
Есть несколько мест, где нотация ->
может быть полезной. Наиболее важным является реализация -copyWithZone:
, где это может быть абсолютно необходимым (требование, которое действительно подчеркивает, почему я ненавижу любой код ObjC, который играет с необработанной памятью, например NSCopyObject ( )
делает). Но я не рекомендую ->
в большинстве случаев по тем же причинам я всегда рекомендую аксессуары. Даже в том случае, когда вам нужно передать ivar по ссылке на функцию C (другое распространенное использование ->
), я предпочитаю использовать временный, а затем назначать его позже.
Я считаю факт что ivars не являются @private
по умолчанию, чтобы быть ошибкой в ObjC .... Я помещаю @private
в начало каждого блока @interface
и имею Таким образом удалось избежать нескольких неприятных ошибок.
Кстати, ваше решение в том виде, в котором оно написано, может иметь утечку NSColor
. Может быть, а может и нет, но аксессуар обязательно.
Я считаю тот факт, что ivars не @private
по умолчанию, является ошибкой в ObjC .... Я поставил @private
в верхней части каждого блока @interface
и таким образом удалось избежать нескольких неприятных ошибок.
Кстати, ваше решение, как написано, может пропускать NSColor
. Может быть, а может и нет, но аксессуар обязательно.
Я считаю тот факт, что ivars не @private
по умолчанию, является ошибкой в ObjC .... Я поставил @private
в верхней части каждого блока @interface
и таким образом удалось избежать нескольких неприятных ошибок.
Кстати, ваше решение, как написано, может пропускать NSColor
. Может быть, а может и нет, но аксессуар обязательно.
Это будет нормально работать, если оно находится внутри вашего @implementation. Я бы порекомендовал вам сделать это обычным методом, но он работает.
Если вы уберете его из своей реализации, вы получите следующее предупреждение: Предупреждение: переменная экземпляра '' равна @protected; это будет серьезной ошибкой в будущем. Вы можете избежать этой ошибки, поместив @public перед iVar в заголовке ... вот так:
@public
int myInt;
Это позволяет вам получить доступ к таким переменным, как C (указатель) Struct, где бы объект ни появился без предупреждения.
Так что это выполнимо, но не рекомендуется !!!