Soga_
@Soga_ (Soga)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

そして考えることをやめた〜オブシーの関数の戻り値〜

解決したいこと

最近objectyve-Cをやっててすごくむずむずしたので、納得させてほしいです。
(できれば何も知らない人が見た時の感想も欲しいデス)

注意)
Swift大好きマンなのでオブシーに偏見があります。

発生している問題

-(void)関数名 {
   処理内容
}

自分で試したこと

void!?
何か返した方がええんか????
(結局必要ないものは返さない方がいいなと思って返してない)

ただ、終わったらどうするのって意味で絶対にnilを返すとか考えてこの言語作られてたら面白いよな、なんて思ってます。

皆さんはどう思いますか?
(にわかなので間違ったこと書いているかもしれません、、それも勉強になるので変なところあったらご指摘くださいね)

0

返り値が void のメソッドは何も返しません。何かを return しようとしたり、返り値を使おうとしたりするとコンパイルエラーになります。

myvoid1.m
#import <Cocoa/Cocoa.h>

@interface MyObject : NSObject
- (void)myVoid;
@end


@implementation MyObject
- (void)myVoid {
    NSLog(@"myVoid called");
    return nil;
}
@end

int main() {
    NSLog(@"myVoid=%@", [[[MyObject alloc] init] myVoid]);
    return 0;
}
% clang -framework Cocoa myvoid1.m
myvoid1.m:11:5: error: void method 'myVoid' should not return a value [-Wreturn-type]
    return nil;
    ^      ~~~
myvoid1.m:16:25: error: argument type 'void' is incomplete
    NSLog(@"myVoid=%@", [[[MyObject alloc] init] myVoid]);

もし void を返すメソッドを performSelector: で呼んで返り値を使おうとすると、コンパイルは通りますが実行時エラーになります。

myvoid2.m
#import <Cocoa/Cocoa.h>

@interface MyObject : NSObject
- (void)myVoid;
@end


@implementation MyObject
- (void)myVoid {
    NSLog(@"myVoid called");
}
@end

int main() {
    NSLog(@"myVoid=%@", [[[MyObject alloc] init] performSelector:@selector(myVoid)]);
    return 0;
}

% clang -framework Cocoa myvoid2.m && ./a.out
2022-01-13 14:27:45.590 a.out[24164:411172] myVoid called
zsh: segmentation fault  ./a.out

nil を返す仕様にしてもよさそうな感じですが、たぶん C 言語の仕様との兼ね合いでこうなっています。

0Like

歴史的には「どこかから呼び出され処理を終えると呼び出し元に戻る」な「サブルーチン」では値を返す機能がありませんでした。
そこから処理結果を返す方法をルール化した「関数」が生まれます。
そういう順番なので昔は値を返さない方が基本で、値を返す方がその拡張形式でした。

あとはまあ、昔自分が書いた記事の繰り返しになってしまうので気が向いたら読んでみてください。

0Like

なるほど、C言語の名残か、、、、
(そもそもObcのベースがCだったか、、、)
Voidに惑わされちゃダメですね!!!!

0Like

Your answer might help someone💌