การแปลง URL เป็นสตริงและกลับมาอีกครั้ง


141

ดังนั้นผมจึงได้แปลงไปNSURL Stringดังนั้นถ้าฉันprintlnดูเหมือนfile:///Users/...ฯลฯ

ต่อมาฉันต้องการให้มันกลับมาเป็นแบบเดิมNSURLดังนั้นฉันจึงลองและแปลงมันกลับมาตามที่เห็นด้านล่าง แต่ฉันทำเครื่องหมายทับซ้ายสองอันที่ปรากฏในเวอร์ชั่นสตริงข้างต้นเสียซึ่งจะทำให้รหัสแตกเนื่องจากurlไม่ถูกต้อง

เหตุใดการแปลงของฉันกลับเป็นการNSURLลบเครื่องหมายสแลชสองอันจากStringฉันให้ไว้และฉันจะแปลงกลับไปเป็นNSURLเครื่องหมายทับสามอันที่มีอยู่ได้อย่างไร

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 (สตริง: "")
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
ยอดเยี่ยม หรือตอนนี้ใน Swift:URL(string: urlstring)
Brent Faust

1
บางทีคุณอาจต้องการ "urlstring.removingWhitespaces ()" เนื่องจาก URL (สตริงไม่มีความสามารถในการทำงานเมื่อสตริงมีช่องว่าง
Carlos Parada

147

ในสวิฟท์ 4และสวิฟท์ 3 , การแปลงสายอักขระไปยัง URL:

URL(string: String)

หรือ,

URL.init(string: "yourURLString")

และการแปลง URL เป็น String:

URL.absoluteString

ด้านล่างนี้แปลง 'เนื้อหา' ของ URL เป็นสตริง

String(contentsOf: URL)

25
ส่วนที่สองไม่ถูกต้อง String(contentsOf: URL)ส่งคืนเพย์โหลดจริงของทรัพยากรไม่ใช่ URL ในรูปแบบสตริง ใช้URL.absoluteStringเพื่อรับรุ่นสตริงของ URL developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski

4
คุณทำผิดพลาดเหมือนกันในstackoverflow.com/a/39967995/2227743โดยที่คุณสร้างการแปลง URL ให้เป็นสตริงด้วยการแปลงเนื้อหาที่ดาวน์โหลดเป็นสตริง คุณควรลบส่วนนี้ของคำตอบของคุณเพราะมันผิดทั้งหมด (หรือนอกหัวข้อ แต่ท้ายที่สุดมันผิดเพราะมันไม่ตอบคำถาม)
Eric Aya

1
35+ คนพบว่ามีประโยชน์และอัปเดตแล้วฉันต้องการเก็บไว้ตามที่ชอบ
Naishta

72

มีวิธีที่ดีกว่าในการรับเวอร์ชันสตริงของพา ธ จาก NSURL ใน Swift:

let path:String = url.path

5
แต่จะส่งคืนเฉพาะ/questions/27062454/converting-url-to-string-and-back-againURL/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

เมื่อเราต้องการให้มีสตริง แต่ไม่มีส่วนรูท (โปรดทราบว่าการเข้ารหัสเปอร์เซ็นต์จะถูกลบโดยอัตโนมัติ):

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 ไปยังระบบไฟล์จะไม่ทำงานเสมอไปขึ้นอยู่กับวิธีการจริงที่ใช้ คำเตือนที่นี่คือพวกเขาอาจถูกลบหรือเพิ่มโดยอัตโนมัติดังนั้นดีกว่า debug การแปลงเหล่านี้อย่างระมัดระวัง


9

รหัสเวอร์ชั่น Swift 3:

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

4

2563 | 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

Swift 3 ใช้กับ UIWebViewDelegate shouldStartLoadWith

  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.