お久しぶりです、happy_ryo です。
最近、個人で書いているアプリは Objective-C ではなくて、Swift で書いてみるようにしています。
HTTP の GET リクエストのクエリストリングは、format などでベタで書かずに、一旦 Dictionary に格納してリクエストを投げる前に生成する派なのですが
そんな中、Objective-C でもよく有った、String に標準で用意されている API では URL エンコードをするには不十分、というアレと向き合う必要があったので、iOS8 も出た事だし思い切って iOS6 を切り捨てて iOS7 以上対応で書いてみました。
iOS6 までは CFURLCreateStringByAddingPercentEscapes を使って解決するのが一般的な方法でしたが、今回は iOS7 で追加された stringByAddingPercentEncodingWithAllowedCharacters を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
// extension で NSDictionary を拡張 extension NSDictionary{ func paramsString() -> String { var pairs = NSMutableArray() for (key,value) in self as [String:AnyObject] { if value is NSDictionary { for (dictKey,dictValue) in value as [String:String]{ pairs.addObject("\(key)[\(dictKey)]=\(escapString(dictValue))") } }else if value is NSArray { for arrayValue in value as [String] { pairs.addObject("\(key)[]=\(escapString(arrayValue))") } }else{ pairs.addObject("\(key)=\(escapString(value as NSString))") } } let queryString = pairs.componentsJoinedByString("&") return "?\(queryString)" } func escapString(value:String!) -> String { // エンコードしたくない文字セットを作成 let customAllowedSet = NSCharacterSet(charactersInString:"!*'()@&=+$,/?%#[];:").invertedSet // 指定された文字セット以外の文字を全てパーセントエンコーディング return value.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)! } } var dict = NSMutableDictionary.dictionary() dict["hoge"] = "fuga" dict["piyo"] = "foo" dict["array"] = ["a","r","r","a","y"] dict["dict"] = ["key":"value","key2":"value2"] dict.paramsString() // ?dict[key]=value&dict[key2]=value2&piyo=foo&array[]=a&array[]=r&array[]=r&array[]=a&array[]=y&hoge=fuga let dict2:NSDictionary = ["hoge":"!*'()@&=+$,/?%#[];:"] dict2.paramsString() // ?hoge=%21%2A%27%28%29%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%3B%3A |
Playground にベロッと貼り付ければ、出力を実際に確認する事が出来ます。
Swift は諸々の理由で業務に乗ってくるのには時間がかかると思いますが、cocoa が swift に切り替わる未来が「来れば」乗り換えるメリットが大きくなるので、これからも追いかけていこうと思います。
このエントリ内のコードは APL 2.0 です。
営業→工場で作業→Word&Excel→Java→shellscript→Java→PHP→Python→Objective-C→Swift→PHP→JavaScript→ベトナム 子会社CTO→本社CTO←イマココ