Obj-C メソッド:パラメータを使用した呼び出し
-
03-07-2019 - |
質問
C スタイルの関数を使用していましたが、インスタンス変数が表示されないことを知りました。そこで、それらを Objective-C メソッドに変換するようにアドバイスされました。
NSString* myfunc ( int x )
は次のようになります:
- (NSString *)myfunc:(int)x
そして
myString = myfunc(x);
になる
myString = [myString myfunc:x];
??
これは不吉な警告とともにコンパイルされますが、機能しません。私は何を誤解していたのでしょうか?
解決
通話が間違っているようです。おそらく試してみてください:
NSString *myString = [self myfunc:x];
他のヒント
私が理解している限りでは、NScodeオブジェクトに -myfunc:
メッセージを送信します。したがって、 -myfunc:
メソッドは、 NSString
クラス(または NSString
のカテゴリ)で宣言する必要があります。
これがやりたい場合、メソッドの結果としてオブジェクト自体を返す必要はありません。メソッド実装でインスタンス変数を変更できます。メソッド呼び出し(またはメッセージ送信)は次のようになります。
[myString myfunc:x];
メッセージを別のクラスのオブジェクトに送信して文字列を返す場合、メソッド宣言は正しいが、クラス実装とメッセージの受信者に表示される必要があります(これは正方形の左側の項目です括弧)はそのクラスのものでなければなりません:
@implementation MyClass
-(NSString *)myfunc:(int)x
{
NSString * returnString;
...// do something with x, returnString and instance variables
return returnString;
}
@end;
...
MyClass * myobj = [[MyClass alloc] init];
NSString * myString = [myobj myfunc:42];
2番目の答えとして、最近のすべての質問を通して問題を理解しようとしています。
開始には、へのポインターを返すC関数がありました。 NSString
オブジェクト:
NSString * myfunc( int x )
{
... // Do something with x
NSString * myString = @"MYDATA";
... // Do something with myString
return myString;
}
次に、その関数に UIImageに関するコードを追加したい
オブジェクト:
image1.image = [UIImage imageNamed:@"image1.png"];
関数をメソッドに変換することをお勧めしました。 .image
インスタンス変数にアクセスする場合、このメソッドは image1
オブジェクトのクラスに属している必要があります(これは AlanImage
クラスだとしましょう) 。このようなもの:
@interface AlanImage : NSObject {
UIImage image;
}
- (NSString *) myfuncWithParam: (int) x;
@end;
@implementation AlanImage
- (NSString *) myfuncWithParam: (int) x
{
NSString * myString = @"MYDATA";
image = [UIImage imageNamed:@"image1.png"];
return myString;
}
@end
3番目、何があったかわからなかったメソッドの受信者。私の調査では、あなたの image
オブジェクトが良い候補になる傾向があります:
aNiceString = [image myfunc:aNiceInteger];
最後に(この質問)、満足のいく答えが得られなかったので、3番目の質問を書き直し、今回は成功しました。
ヒントを提供するために、プロジェクトのより完全なビューを取得したいです。とにかく、あなたはObjective-Cとオブジェクト指向の概念を学んでいるようです:おめでとうとモチベーションを保ちましょう!
オブジェクト指向プログラミングが何であるかを理解していません。 [theObject method]
では、特定のインスタンスに属するメソッドのみを呼び出すことができます。
次のトリックが「一般的な」objective-c に対して正しく機能するかどうかはわかりませんが、Apple の実装では次のようなことができます。
@interface SomeClass: NSObject {
int m_someVariable;
...
};
- (NSString *) someMethod;
...
@end
@implementation SomeClass
...
//pure c function with extra one parameter
//for accessing to instance variables
static NSString privatePlainCeeMethod(SomeClass *my, int fortyTwo) {
NSString *str;
//access to a instance variable as for a usual
//cee structure field: my->fieldName
...
return [NSString stringWithFormat:@"someVariable:%d, fortyTwo:%d",
my->m_someVariable, fortyTwo];
};
- (NSString *) someMethod {
...
return privatePlainCeeMethod(self,42);
};
...
@end
このようなトリックを使用して、大きな objc メソッドを監視可能なプライベートの単純な関数に分割します。これらの関数は、(a) クラス インターフェイスを汚染せず、(b) objc メソッドよりも高速に呼び出されます。