0

私が知っているほとんどの言語は、次の構文を使用します。

function name (var1,var2,var3) {
    //do stuff with variables
}

ただし、Objective-C はやや複雑な構造になります

- (function type) functionName:(type)var1 var2:(type) var2  var3:(type) var3{
}

なぜそうしないのか

- (function type) functionName:(type) var1 (type) var2 (type) var3{
}

以下を行うことは可能ですか?それはどのような意味がありますか?

- (function type) functionName:(type)var1 randomName:(type) var2  anotherName:(type) var3{
}
4

3 に答える 3

8

コロンの前の部分を省略することは、完全に正当な Objective-C です。API 設計者が望むなら、次のように記述できたはずです。

- (void)removeObserver:(NSObject *)observer :(NSString *)keyPath :(void *)context

それ以外の

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context

そのコードを読んでみてください

[self removeObserver:self :@"something" :@"somethingElse"];

とは対照的に

[self removeObserver:self forKeyPath:@"something" context:@"somethingElse"];

より読みやすいものは何ですか?

ところで、メソッド名と引数がインターリーブされていない OS X API メソッドがいくつかあります。1 つの例は CAMediaTimingFunction です。

+ (id)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y
于 2013-02-27T20:54:25.837 に答える
3

Objective-C のメソッドは自己文書化するように設計されており、Smalltalk の豊かな伝統を取り入れています。このStackoverflowの回答で詳細な説明を見ることができます

また、自己文書化とは、メソッド宣言自体が、メソッドの主な機能と受け取ったパラメーターの目的に関する情報を提供することを意味します。

したがって、最後の質問に答えるために、はい、そのようなメソッド宣言を使用できます。実際、これは、受信したパラメーターを記述できる Objective-C の利点の 1 つです。

たとえば、次のようにします。

- (BOOL)saveFile:(NSString *path, NSString *fileName);

Objective C では、次のようにメソッドを自己文書化するために言い換えます。

- (BOOL)saveFileInPath:(NSString *)path withName:(NSString *)name;
于 2013-02-27T20:49:51.523 に答える
2

Objective-C の構文は、わかりやすくすることを目的としています。したがって、コード行を読むと、何が起こっているかが正確にわかります。

例えば:

[myData writeToFile:@"/tmp/log.txt" atomically:NO append:YES];

とは対照的に

myData.writeToFile("/tmp/log.txt", false, true);

私の意見では、コードの最初の行はより明確です。メソッド呼び出しを読むだけで、各引数が何をするかを正確に知ることができます。

于 2013-02-27T20:51:26.093 に答える