

パスの設定をする際、エラーが生じてしまいます。これはどのように書き直すのがよろしいのでしょうか？教えてくださる方がいましたら、どうかよろしくお願いいたします。

質問文の更新ですが、getCacheDirectory()の返り値の型はNSStringです。

[code]

    func getFileURL() -> NSURL{
        let path  = getCacheDirectory().stringByAppendingPathComponent(fileName)//ここでエラーが出ます。
    
        let filePath = NSURL(fileURLWithPath: path)
    
        return filePath
    }
    
[/code]


CC BY-SA 3.0
2015-10-08T04:04:08.277
17401
2015-10-16T16:10:31.700
2015-10-16T16:10:31.700
5519
12536
question
swift
stringByAppendingPathComponentのエラーについて


> エラーのメッセージは、 'stringByAppendingPathComponent' is unavailable: Use  
>  URLByAppendingPathComponent on NSURL instead. というものです。

でしたら、関数`getCacheDirectory()`の返値の型は、`String`だと思われます。  
型（クラス名）を確認するには、`dynamicType`を使います。（以下の確認コードとその結果は、Xcode 7.0.1、Swift
2.0で実行したものです。旧バージョンだと、おなじ結果にならないかもしれません）

[code]

    print(getCacheDirectory().dynamicType)
    
[/code]

返値の型が`NSString`であれば、`__NSCFString`と出力するはずです。`__NSCFString`は、`NSString`のクラスクラスタのひとつです。  
返値の型が`String`であれば、そのまま`String`と出力します。


CC BY-SA 3.0
2015-10-08T07:35:50.383
17416
2015-10-08T09:34:14.007
2015-10-08T09:34:14.007
7362
7362
17401
answer


`getCacheDirectory()`の実装が分かりませんが、

[code]

    func getCacheDirectory() -> NSString {
        return NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true).last!
    }
    
[/code]

のようなものであれば、普通に`stringByAppendingPathComponent`は使えます。

[code]

    let path  = (getCacheDirectory() as NSString).stringByAppendingPathComponent(fileName)
    
[/code]

のようにキャストする方法もありますが、一度`NSURL`に変換する方法が好まれます。

* * *

Swiftは`String`と`NSString`の間に暗黙の変換がありますが、バージョンを経ることに段々と制約が増えていきます。

理由は、Swiftの`String`が値型であることに対して、Objective-Cの`NSString`は参照型であることかと思います。

`NSString`はクラスクラスタなので、複数のサブクラス実装がありますが、それらすべてに対してブリッジしてしまうので、`NSString`のサブクラス実装によってはコピー処理によって予期せぬパフォーマンス性能劣化を引き起こすからです。

Swift
1.2から2.0で、`stringByAppendingPathComponent`のようなパス文字列を扱うメソッド群（実装が`NSPathStore2`にあると考えられるもの）を使うと、

> 'stringByAppendingPathComponent' is unavailable: Use
> URLByAppendingPathComponent on NSURL instead.

というコンパイルエラーが出るようになりました。これは上述の問題を回避するために一度`NSURL`に変換して、`URLByAppendingPathComponent`で代替するべきだというメッセージですので、それに従うのが無難かと思います。


CC BY-SA 3.0
2015-10-08T12:02:15.133
17428
2015-10-08T12:02:15.133
5337
17401
answer