1

私は最終的に Objective-C を試してみることにした Web デザイナー/開発者です。私は、標準化を強く信じており、言語によって定められたガイドライン、フォーマット、または不文律を順守することを強く信じており、それをどのように行うべきかについて自分の考えを押し付けたり、独自の方法を使用したりするのではありません (しゃれは意図されていませんが、それと一緒に行きます)。言い換えれば、私はcamelCaseVarNamesorを使ってコードを書くことにオープンですunderscore_var_names。上記の言語で「一般的に受け入れられている」方法が何であるかを知りたいだけです。

とにかく、特に既存のクラスを拡張する場合に、Objective-C メソッドを記述する適切な方法を知りたいです。私は赤ちゃんの一歩を踏み出しているので、MVC の設計パターンや「懸念事項の分離」については今のところ心配していません。私はデフォルトのAppDelegate実装ファイルで作業しています (ええ、私はワルです)。<head>CSS を学ぶときに、HTML ファイルの中にたくさんのスタイルを書くのと同じだと思いたいのですが。このボタンの機能とそのボタンの機能を確認しようとしています。わかる?

さて、ここにシナリオがあります。ビューが特定のクラスのものかどうかを確認する単純なメソッドを書きたいとします。これを行う方法はたくさんあると思いますが(NSObjectそのような機能を必要とせずにすべての方法がこの機能を持っている可能性があります)、冗談を言います。これが私が思いついたものです(お気軽に笑ってください):

- (BOOL)viewInstance:(id)view isOfClass(NSString *)className
{
    return ( [view class] == NSClassFromString(className) );
}

私が抱えている問題はviewInstance:、それ自体ではかなり無意味であり、私が読んだことによると、Objective-Cer は superRichAndDescriptiveMethodNamesThatAreSelfDocumenting を愛しています。そうは言っても、メソッド名全体には 2 番目の部分が含まれます — 2 番目の部分は名前付きの引数またはパラメーターであると想定しています。一緒に読むと、実際には少し意味があります。私が話していることの実際の例は、NSColorcolorWithDeviceRedメソッドです。Red:が最初のパラメーターであることに気付く前に、ポップアップ補完リストを 20 回調べました。完全な宣言は次のとおりです。

+ (NSColor *)colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha

関数に特定の方法で名前を付ける時期および/または方法について、私は混乱しているだけだと思います。また、オブジェクトの初期化は私を混乱させます。私が知っている言語では、次のような配列を作成します。

// JavaScript
var myArray = [ 1, 2, 3 ];

// PHP
$my_array = array( 1, 2, 3 );

// AppleScript
set myArray to { 1, 2, 3 }

// ActionScript
var myArray:Array = new Array( 1, 2, 3 );

// Python
my_array = [ 1, 2, 3 ]

// P.S. I add spaces between brackets because I'm a special boy, so no judgments.

Objective-C では、どちらを使用すればよいかわかりません。

NSArray *myArray = [NSArray new];
NSArray *myArray = [NSArray array];
NSArray *myArray = [[NSArray alloc] init];
NSArray *myArray = [[NSArray alloc] initWithArray:@[1,2,3]];
NSArray *myArray = [NSArray arrayWithArray:@[1,2,3]];
NSArray *myArray = @[1,2,3];

配列リテラルは、他の言語から来るのが最も理にかなっているからです。私が本当に理解していないのは、上記のステートメントでinitWithArrayメソッドとメソッドがどのように存在するかarrayWithArrayです。うーん。同じ基になるメソッドを呼び出しますか?

私を本当に混乱させるのはこれです:

[[NSDictionary alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]

NSDictionary のヘッダー ファイルを見ると、2 つの別々のメソッドのように見えます。私は次のようなオプションの引数を見ることに慣れています:

function initWithObject(object, copyItems) {
    var obj = {};
    if ( copyItems ) {
        ...
    }
    return obj;
}

私の例では、含まれていると関数の流れが変わるオプションの引数があります。2 つのメソッドについては、おそらく完全に間違っていますが、Objective-C について少し知っている限りでは、そのように見えます。とはいえ、ネットオタクだからといって逃げるつもりはありません。ええ、スレッドをスリープ状態にして のようなものを書けるのは少し怖いですがNSTerminateNow、皆さんの助けを借りて、実際に 1 つまたは 2 つのことを学ぶことができると思います。では、教えてください!

私の文章は少し「冗長」になることがありますので、ここまで読んでいただきありがとうございます。

4

1 に答える 1

1

この質問はスタック オーバーフローにとっては少し焦点が合っていませんが、そこには明確な質問がいくつかあります。コーディング標準については、まずApple のガイドラインを読み、Apple のソース コードを調べてください。常に完全な署名でメソッドを読み取るようにしてください。NSColor colorWithDeviceRed:green:blue:alpha:-- これは、コンパイラがそれらを理解する方法です。

コレクションの初期化は、ARC が解放/保持を処理するようになったため、少し遺物になっています。基本的に「init」形式を使用すると、保持されたオブジェクトが返され、クラス メソッド[NSArray array]は自動解放されたオブジェクトが返されます。@[ ]短くてわかりやすいので使います。

ディクショナリのインスタンス化の質問では、あるディクショナリを別のディクショナリで初期化すると、A に含まれるオブジェクトが B にも含まれるようになります。A に含まれるオブジェクトのコピーを実際に B に入れたい場合はinitWithDictionary:copyItems:、(浅い) コピーを実行します。それらのアイテムの。

NSMutableString *someString = [@"abc" mutableCopy];
NSDictionary *a = @{ @"key" : someString };
NSDictionary *b1 = [[NSDictionary alloc] initWithDictionary:a];
NSDictionary *b2 = [[NSDictionary alloc] initWithDictionary:a copyItems:YES];

[someString appendString:@"def"];
// b1[@"key"] == abcdef
// b2[@"key"] == abc
// Note also that b1[@"key"] will be a mutablestring, b2[@"key"] will not

通常、コピーする必要があることがわかっていない限り、コピーする必要はありません。幸運を!

于 2013-09-19T00:39:45.273 に答える