2012-09-06 7 views
5

+[NSURL URLWithString:]を呼び出すとき、私は私のURLを構築するための2つのオプションがあります。- [NSString stringByAppendingPathComponent:]またはNSStringsのNSStringsの[NSString stringByAppendingFormat:]のみですか?

[[@"http://example.com" stringByAppendingPathComponent:@"foo"] stringByAppendingPathComponent:@"bar"] 

または

[@"http://example.com" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"]; 

-[NSString stringByAppendingPathComponent:]は、より正しい答えのように思えるが、私は二重スラッシュを扱うほか-[NSString stringByAppendingFormat:]を使って何かを失うん次の場合は?

// http://example.com/foo/bar 
[[@"http://example.com/" stringByAppendingPathComponent:@"/foo"] stringByAppendingPathComponent:@"bar"] 

// http://example.com//foo/bar oops! 
[@"http://example.com/" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"]; 
+0

'stringByAppendingPathComponent'は、理論的には、使用されますが"システムパスセパレーター"とあなたのフォーマットに配線されたパスセパレーターを比較すると、あなたのコードは(わずかに)システムに依存しなくなります。もちろん、Objective-CはWindozeではあまり一般的ではありませんので、大きな問題ではありません。 –

答えて

3

あなたはURLで作業しているとして、あなたはNSURLメソッドを使用する必要があります

NSURL * url = [NSURL URLWithString: @"http://example.com"]; 
url = [[url URLByAppendingPathComponent:@"foo"] URLByAppendingPathComponent:@"bar"] 

またはスウィフト

var url = NSURL.URLWithString("http://example.com") 
url = url.URLByAppendingPathComponent("foo").URLByAppendingPathComponent(".bar") 
0

stringByAppendingPathComponentのポイントは次のような何かを行うことができ、しかし、ダブルスラッシュを処理することです:

[[@"http://example.com/" stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%@", @"foo", @"bar"]] 
1

方法について:

[NSStringののpathWithComponents: "@ [@のhttp ://example.com "、" @ "foo"、@ "bar"]]

このように、 nts a /は、NSPathUtitlites.hのメソッドを使用するときにプロトコルから削除されるため、明らかに減少しています。私はそれは私が掲示オリジナルのものに最も近いを思い付くことができソリューションです:

[@[ @"http://example.com", @"foo", @"bar" ] componentsJoinedByString:@"/"] 

あなたは何NSString doesあるパス区切りのためにリテラルを使用する必要があります。

NSStringパス区切り として「/」と総称パスを表す「」拡張セパレータとして。

+1

URLから//これを取り除きます。出力はhttp:/example.com/foo/barです。これは悪いです。下記参照。 –

3

私はちょうどstringByAppendingPathComponentに問題に遭遇した:それはどこでもダブルスラッシュを削除します!:

NSString* string1 = [[self baseURL] stringByAppendingString:partial]; 
NSString* string2 = [[self baseURL] stringByAppendingPathComponent:partial]; 

NSLog(@"string1 is %s", [string1 UTF8String]); 
NSLog(@"string2 is %s", [string2 UTF8String]); 

https://blah.com

のBASEURLとの部分的/

が生成するmoreblahのために2つの文字列:

2012-09-07 14:02:09.724 myapp st 02::RING1はhttps://blah.com/moreblah

2012年9月7日14である/blah.com/moreblah

しかし、単一のスラッシュでリソースの作業を取得するblah.comにはいくつかの理由で私のコール:09.749 myappというstring2のがhttpsであります。しかし、それは私に、stringByAppendingPathComponentがパス(NOT URL)用であることを示しています。

これはiOS 5.1を実行しているiPhone 4ハードウェアに搭載されています。

私が見ていたデバッガの出力が確実であることを確認したかったので、私はUTF8文字列を出力しました。

だから私は言っていると思います - URLにパスのものを使用せず、自家製のものやライブラリを使用してください。

+0

二重スラッシュが単一のスラッシュに縮小されているのは、おそらく['stringByStandardizingPath'](http://developer.apple.com/library/mac/#documentation/cocoa/Reference/Foundation/Classes/NSString_Class)の呼び出しの結果でしょう。 /Reference/NSString.html#//apple_ref/occ/instm/NSString/stringByStandardizingPath)をパスメソッドで照会してURL用ではありません。私はあなたに答えた直後に自分の答えを更新しました。 – Joe

+0

それは新しい行動であるかもしれません(過去1年ほど) - 私は、 "//"と ".."を持つパスを悪意のあるアクティビティ(例えば、ファイルシステム。 –

+0

@Ashley Millsの答えは正しいようです。 –

関連する問題