URLを文字列に変換し、再度戻す


141

だから私はに変換しNSURLましたString。私のであればprintln、それがどのように見えるfile:///Users/...など

後で私はこれを元に戻したいNSURLので、以下のように変換して戻しますが、上記の文字列バージョンに表示される2つのスラッシュが失われ、url無効なためコードが破損します。

なぜ私はNSURL2つのフォワードスラッシュを削除Stringすることに変換を戻すのNSURLですか、また3つのスラッシュを含むスラッシュに戻すにはどうすればよいですか?

var urlstring: String = recordingsDictionaryArray[selectedRow]["path"] as String
println("the url string = \(urlstring)")
// looks like file:///Users/........etc
var url = NSURL.fileURLWithPath(urlstring)
println("the url = \(url!)")
// looks like file:/Users/......etc

Swift 5では、文字列をURLに変換するのはFoundation.URL(string: "")です。
Kanishk Gupta

回答:


122

fileURLWithPath()プレーンファイルパス(たとえば、「/ path / to / file」)をURLに変換するために使用されます。あなたurlStringはスキームを含む完全なURL文字列なので、使用する必要があります

let url = NSURL(string: urlstring)

に変換して戻しNSURLます。例:

let urlstring = "file:///Users/Me/Desktop/Doc.txt"
let url = NSURL(string: urlstring)
println("the url = \(url!)")
// the url = file:///Users/Me/Desktop/Doc.txt

9
優れた。または現在スウィフトで:URL(string: urlstring)
ブレントファウスト

1
たぶん "urlstring.removingWhitespaces()"が必要になるかもしれません。URL(stringには、文字列にスペースがある場合に機能する能力がないためです
Carlos Parada

147

スウィフト4スウィフト3URLに文字列を変換するには:

URL(string: String)

または、

URL.init(string: "yourURLString")

URLを文字列に変換するには:

URL.absoluteString

以下のものは、URLの「コンテンツ」を文字列に変換します

String(contentsOf: URL)

25
2番目の部分は正しくありません。String(contentsOf: URL)文字列形式のURLではなく、そのリソースの実際のペイロードを返します。URL.absoluteStringURLの文字列バージョンを取得するために使用します。developer.apple.com/reference/foundation/nsurl/...
トミスラフMarkovski

4
あなたはstackoverflow.com/a/39967995/2227743と同じ間違いを犯しています。そこでは、URL自体を文字列に変換することと、ダウンロードしたコンテンツを文字列に変換することを両立させています。回答のこの部分は完全に間違っているため(またはトピックから外れていますが、最終的には質問に回答しないため間違っています)、削除する必要があります。
Eric Aya

1
35人以上がこれが有用であると考え、賛成しました。
Naishta 2018年

72

SwiftのNSURLからパスの文字列バージョンを取得するより良い方法があります:

let path:String = url.path

5
ただし/questions/27062454/converting-url-to-string-and-back-again、URLでのみ返されます/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar

1
これは、文字列パスを必要とする他のいくつかのFileManagerメソッドのパスを使用する場合に実際に役立ちます。彼らはfile://フォーマットが好きではありません。
Ben Baron

29

注意:URLに注意してください。optionalそうである場合もありますnil。URLを引用符で囲んで文字列に変換できます。プレイグラウンドでテストできます。
Swift 5、Xcode 11のアップデート:

import Foundation

let urlString = "http://ifconfig.me"
// string to url
let url = URL(string: urlString)
//url to string
let string = "\(url)"
// if you want the path without `file` schema
// let string = "\(url.path)"

1
これはスキームの接頭辞も返すことに注意してください(と考えてくださいfile:///Users/foo)。一方、絶対パスだけが必要な場合(と考える/Users/foo)、url.path以下の@iphaawの回答のように使用する必要があります。
Ahmed Khalaf


14

Swift 3(NSURLは忘れてください)。

let fileName = "20-01-2017 22:47"
let folderString = "file:///var/mobile/someLongPath"

文字列からURLを作成するには:

let folder: URL? = Foundation.URL(string: folderString)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath

ファイル名を追加したい場合。appendingPathComponent()はパーセントエンコーディングを自動的に追加することに注意してください:

let folderWithFilename: URL? = folder?.appendingPathComponent(fileName)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath/20-01-2017%2022:47

Stringを使用したいがルート部分は使用しない場合(パーセントエンコーディングは自動的に削除されることに注意してください):

let folderWithFilename: String? = folderWithFilename.path
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017 22:47"

ルート部分を保持したい場合は、次のようにします(ただし、パーセントエンコードに注意してください-削除されません)。

let folderWithFilenameAbsoluteString: String? = folderWithFilenameURL.absoluteString
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017%2022:47"

文字列のパーセントエンコーディングを手動で追加するには:

let folderWithFilenameAndEncoding: String? = folderWithFilename.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017%2022:47"

パーセントエンコーディングを削除するには:

let folderWithFilenameAbsoluteStringNoEncodig: String? = folderWithFilenameAbsoluteString.removingPercentEncoding
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017 22:47"

ネットワークリクエストのURLはパーセントエンコーディングを必要とするため、パーセントエンコーディングは重要ですが、ファイルシステムへのURLは常に機能するとは限りません。これは、パーセントエンコーディングを使用する実際の方法によって異なります。ここでの注意点は、自動的に削除または追加される可能性があるため、これらの変換を慎重にデバッグすることです。


9

Swift 3バージョンコード:

let urlString = "file:///Users/Documents/Book/Note.txt"
let pathURL = URL(string: urlString)!
print("the url = " + pathURL.path)

4

2020 | SWIFT 5.1:

let url = URL(fileURLWithPath: "//Users/Me/Desktop/Doc.txt")

let a = String(describing: url)       // "file:////Users/Me/Desktop/Doc.txt"
let b = "\(url)"                      // "file:////Users/Me/Desktop/Doc.txt"
let c = url.absoluteString            // "file:////Users/Me/Desktop/Doc.txt"
let d = url.path                      // "/Users/Me/Desktop/Doc.txt" 
// BUT value of `d` will be invisible due to debug process, so...
let e = "\(url.path)"                 // "/Users/Me/Desktop/Doc.txt"

そしてのための拡張 URL?

extension Optional where Wrapped == URL {
    func toString() -> String {
        guard let val = self else { return "" }

        return "\(val.path)"
    }
}

 使用法:

let str = optionalUrl.toString() // "/Users/Me/Desktop/Doc.txt"
    str = emptyOptionalUrl.toString() // ""

1

UIWebViewDelegate shouldStartLoadWithで使用されるSwift 3

  func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    let urlPath: String = (request.url?.absoluteString)!
    print(urlPath)
    if urlPath.characters.last == "#" {
        return false
    }else{
        return true
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.