2014-11-21 116 views
64

因此,我已將NSURL轉換爲String。 所以,如果我println它看起來像file:///Users/...將URL轉換爲字符串並返回

後來我想這回作爲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 

回答

75

fileURLWithPath()用於普通文件的路徑(例如 「/路徑/到/文件」)轉換成一個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 
+2

優秀使用。或者現在在Swift中:'URL(string:urlstring)' – 2017-04-27 03:34:00

18

UPDATE:注意網址,在本例中可以爲零。 你可以用你的網址在報價將其轉換爲字符串

let urlString = "http://ifconfig.me" 
//string to url 
let url = NSURL(string: urlString) 
//url to string 
let string = "\(url)" 
+0

應該注意的是,這也返回了scheme前綴(想'file:/// Users/foo')。雖然如果只需要絕對路徑(想想'/ Users/foo'),那麼應該像下面@ iphaaw的答案中那樣使用'url.path'。 – 2016-08-03 13:24:24

52

有斯威夫特獲得路徑的字符串版本從NSURL的更好的方式:

let path:String = url.path 
+1

,但它只會返回'/ questions/27062454 /轉換 - url-to-string-and-back-again' for url [https://stackoverflow.com/questions/27062454/converting-url-to-string-and -back-again' – 2017-08-17 08:01:06

43

斯威夫特4斯威夫特3爲字符串轉換爲URL:

URL(string: String) 

,或者

URL.init(string: "yourURLString") 

並以URL轉換爲字符串:

URL.absoluteString 

下面的一個URL的 '內容' 轉換爲字符串

String(contentsOf: URL) 
+11

第二部分不正確。 'String(contentsOf:URL)'返回資源的實際有效載荷,而不是字符串格式的URL。使用'URL.absoluteString'來獲取URL的字符串版本。 https://developer.apple.com/reference/foundation/nsurl/1409868-absolutestring – 2016-11-14 13:23:50

+0

謝謝,我已經更新了它 – Naishta 2017-06-08 04:36:51

+1

您犯的錯誤與https://stackoverflow.com/a/39967995/2227743在那裏你混合轉換URL本身到一個字符串與下載的內容轉換爲字符串。你應該刪除這部分答案,因爲它是完全錯誤的(或脫離主題,但最終它是錯誤的,因爲它不回答問題)。 – Moritz 2018-01-08 11:45:53

9

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到文件系統並不總是可行的 - 這取決於實際方法使用它們。這裏需要注意的是,它們可能會被自動刪除或添加,所以更好地仔細調試這些轉換。

6

夫特3版本代碼:

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

@EricAya謝謝。我修改了代碼。 – mriaz0011 2017-02-15 15:38:00

1

夫特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 
    } 

} 
相關問題