stringByAppendingPathComponentは使用できません


132

私のアプリはInstagramで写真を共有します。これを行うには、まず一時ディレクトリに保存します。

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")

動作していましたが動作しSwift 1.2ませんでしたSwift 2.0

与えられたエラーメッセージは:

stringByAppendingPathComponentは使用できません。代わりにNSURLのURLByAppendingPathComponentを使用してください。

回答:


145

このメソッドstringByAppendingPathComponentはSwift 2.0で削除されたようです。そのため、エラーメッセージで示されているのは次のようにすることです。

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("instagram.igo")

更新:

URLByAppendingPathComponent()置換されているappendingPathComponent()ので、代わりに実行します。

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo")

このデザインを使用する場合、スペースを%20に変換するなどの問題が発生しますApplication%20Support
Roman

いいえ、Swift 2.0はを使用できstringByAppendingPathComponentます。以下の私の回答を参照してください。
Jeffrey Neo

2
@JeffreyNeoはい、それはないNSURL方法ではなくNSString
ダニエル・ナギー

@DánielNagy私は「stringByAppendingPathComponentSwift 2.0で削除された」が正しくないと言ったことを意味し、@ Maysam はNSURLメソッドのみを要求しませんでした。
Jeffrey Neo

4
@JeffreyNeoは実際には正しいです。Swift1.2のStringにはstringByAppendingPathComponentというメソッドがありましたが、Swift 2.0のStringにはありません。NSStringはSwift言語の一部ではなく、Foundationフレームワークの一部です。
ダニエル・ナギー

75

次のNSStringように使用できるように機能しています。

extension String {
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.stringByAppendingPathComponent(path)
    }
}

これでStringNSString最初にに変換してから操作を実行するこの拡張機能を使用できます。

そしてあなたのコードは次のようになります:

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")

使用する別の方法をいくつか次に示します。

extension String {  

    var lastPathComponent: String {  
        return (self as NSString).lastPathComponent  
    }  
    var pathExtension: String {  
        return (self as NSString).pathExtension  
    }  
    var stringByDeletingLastPathComponent: String {  
        return (self as NSString).stringByDeletingLastPathComponent  
    }  
    var stringByDeletingPathExtension: String {  
        return (self as NSString).stringByDeletingPathExtension  
    }  
    var pathComponents: [String] {  
        return (self as NSString).pathComponents  
    }  
    func stringByAppendingPathComponent(path: String) -> String {  
        let nsSt = self as NSString  
        return nsSt.stringByAppendingPathComponent(path)  
    }  
    func stringByAppendingPathExtension(ext: String) -> String? {  
        let nsSt = self as NSString  
        return nsSt.stringByAppendingPathExtension(ext)  
    }  
}

こちらからの参照。

Swift 3.0の場合:

extension String {
    func stringByAppendingPathComponent1(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    }
}

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent(path: "instagram.igo")


extension String {

    var lastPathComponent: String {
        return (self as NSString).lastPathComponent
    }
    var pathExtension: String {
        return (self as NSString).pathExtension
    }
    var stringByDeletingLastPathComponent: String {
        return (self as NSString).deletingLastPathComponent
    }
    var stringByDeletingPathExtension: String {
        return (self as NSString).deletingPathExtension
    }
    var pathComponents: [String] {
        return (self as NSString).pathComponents
    }
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    }
    func stringByAppendingPathExtension(ext: String) -> String? {
        let nsSt = self as NSString
        return nsSt.appendingPathExtension(ext)
    }
}

12
これは有効な解決策ですが、Appleがこれらのメソッドを削除したのには理由があります。リソースを検索するためのパスの使用は非推奨であり、NSURL代わりにを使用する必要があります。ただ言って。
チャーリーモンロー

snippet:String(NSString(string:path).stringByAppendingPathComponent(imageName))...それ以外の場合は、@ CharlieMonroe
Bobjt

1
@CharlieMonroeそれが本当にそうである場合、SDKにパスとしてURLを受け入れないメソッドがまだたくさんあるのはなぜですか?
Joris Mans

@JorisMansこれらは通常、古いメソッドです(10.0以降、またはそれ以前に利用可能)。サンドボックスが導入されて以来、appscopeブックマークなどでパスを渡す方法はありません。代わりにURLが必要です。Appleは、ごく一部の人しか使用しないAPIの更新が遅い。または、最近追加されたAPI(過去3〜4年)の例はありますか?
チャーリーモンロー

1
@IulianOnofrei- 代わりにcheckResourceIsReachable()またはcheckPromisedItemIsReachable()を使用する必要があるためURL。Swiftから削除された接頭辞が付いFileManagerたObjCクラスNSFileManagerであり、OS X 10.0以降に存在していました。それ以来、世界は進化しており、アプリがサンドボックス化されているため(iOSではそれほど明確ではありません)、ファイルが存在する可能性があります。ファイルを表示する権限がない可能性があります。また、ファイルがクラウドなどにある可能性もあります。そのため、単純なメソッドがのより複雑なものに置き換えられますが、意味的にはより正確です。NSfileExistsAtPathBOOLURL
チャーリーモンロー

30

文字列をとしてラップするだけNSStringです。

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")

クールなもの.. Stringクラスはこれを持っていませんがNSString存在します!理にかなっています。
preetam

16

スウィフト3

let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path

以上の拡張機能を作成します。

extension String {
    func appendingPathComponent(_ string: String) -> String {
        return URL(fileURLWithPath: self).appendingPathComponent(string).path
    }
}

使用法:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

6

Swift 3ソリューション:

これは、ドキュメントディレクトリパスを取得する関数です。

    func getDocumentsDirectory() -> URL {
         let paths = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask)
         let documentsDirectory = paths[0]
         return documentsDirectory
     }

使い方:

    getDocumentsDirectory.appendingPathComponent("google.com")

結果:

    file:///var/folders/w1/3rcp2fvs1qv43hfsh5876s0h0000gn/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.MyPlayground-7CF9F706-509C-4D4C-997E-AB8FE9E4A6EA/Documents/google.com

5

Swift 2.0の場合

// Get the documents Directory
    func documentsDirectory() -> String {
        let documentsFolderPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
        return documentsFolderPath
    }

// Get path for a file in the directory
func fileInDocumentsDirectory(filename: String) -> String {

    let writePath = (documentsDirectory() as NSString).stringByAppendingPathComponent("Mobile")

    if (!NSFileManager.defaultManager().fileExistsAtPath(writePath)) {
        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(writePath, withIntermediateDirectories: false, attributes: nil) }
            catch let error as NSError {
                print(error.localizedDescription);
        }
    }
    return (writePath as NSString).stringByAppendingPathComponent(filename)
}

//# MARK: - Save Image in Doc dir
func saveImage (image: UIImage, path: String ) -> Bool{

    let pngImageData = UIImagePNGRepresentation(image)
    //        let jpgImageData = UIImageJPEGRepresentation(image, 1.0)   // if you want to save as JPEG
    let result = pngImageData!.writeToFile(path, atomically: true)

    print("\(result)")
    print("\(path)")

    return result

}

2

代わりにURLByAppendingPathComponent()を使用できます。「file://」プレフィックスを削除するには、パス文字列をトリミングする必要があることに注意してください。

let uniqueFileName = NSUUID().UUIDString
let documentsDirectory = getDocumentsDirectoryURL()
    if let path = documentsDirectory?.URLByAppendingPathComponent(uniqueFileName) {
        var pathString = path.absoluteString
        pathString = imagePathString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "file://"))
}

func getDocumentsDirectoryURL() -> NSURL? {
    let fileManager = NSFileManager()
    if let docsDirectory = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first {
        return docsDirectory
    }
    return nil
}


0

私はこれを試しました、そしてそれは問題を解決しました。

前:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

後:

let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)

-1

NSStringStringURLメソッドの代わりに)パスメソッドの使用が許容できるString場合、NSString(目的のメソッドをString拡張で複製する代わりに)計算されたプロパティまたはその値を返すメソッドで拡張する方がはるかに簡単です。

extension String
{
    var ns: NSString { return self as NSString }
}

その後:

swiftStringPath.ns.appendingPathComponent("whateva")
swiftStringPath.ns.deletingPathExtension

-2

スウィフト4

extension String {

    var lastPathComponent: String {
        return (self as NSString).lastPathComponent
    }
    var pathExtension: String {
        return (self as NSString).pathExtension
    }
    var stringByDeletingLastPathComponent: String {
        return (self as NSString).deletingLastPathComponent
    }
    var stringByDeletingPathExtension: String {
        return (self as NSString).deletingPathExtension
    }
    var pathComponents: [String] {
        return (self as NSString).pathComponents
    }
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    }
    func stringByAppendingPathExtension(ext: String) -> String? {
        let nsSt = self as NSString
        return nsSt.appendingPathExtension(ext)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.