Я получаю странный результат, где URL(fileURLWithPath:)
не возвращает значения при вызове определенным образом.Ниже приведен код (простой инструмент командной строки macOS), чтобы проиллюстрировать эту проблему.
Я использую Xcode 10.3 в macOS 10.14.6.Это также происходит на iOS 12.4.1.
Чтобы увидеть проблему, запустите приведенный ниже код.Поместите точку останова в оператор return
в функции weirdStuff(withURL:)
и в строку со 2-й по последнюю.Запустите приложение и, когда код разбит на строке return
, наведите указатель на 4 let
s в функции, чтобы проверить их значения.Вот что странно:
badURL
не будет показывать никакого значения вообще!А панель «Просмотр переменных» консоли отладки покажет, что значение не было определено. copyOfBadURL
будет содержать правильное значение из badURL
, хотя, очевидно, badURL
не существует!
Вывод таков: URL(fileURLWithPath:)
не работает (например, badURL
), когда значение параметра fileURLWithPath:
является переменной, но успешно (goodURL
), когда значение параметра является константойстрока.Это не может быть правдой!
Далее продолжайте запускать приложение, чтобы перейти к другой точке останова.Если вы наведете указатель мыши на url2
, вы увидите, что правильное значение было возвращено через return badURL
.Вы также можете видеть, что badURLNowGood
имеет ожидаемое значение, хотя это, по сути, тот же вызов, который не удался при вызове в моей функции тестирования.
Что здесь происходит?Я никогда не видел, чтобы переменная даже не определялась (после выполнения) раньше (т. Е. badURL
).
import Foundation
func weirdStuff(withURL urlParam: URL) -> URL {
let pathFromParam = urlParam.path
let badURL = URL(fileURLWithPath: pathFromParam)
let goodURL = URL(fileURLWithPath: "/Dir1/file.txt")
let copyOfBadURL = badURL
print("func: badURL = \(badURL)") // is valid here but not if you hover above
print("func: copyOfBadURL = \(copyOfBadURL)")
print("func: goodURL = \(goodURL)")
return badURL // Breakpoint on this line; hover over 4 values above
}
// Call function with URL weirdness
let url1 = URL(fileURLWithPath: "/Dir1/file.txt", isDirectory: true)
let url2 = weirdStuff(withURL: url1)
print("main: weirdStuff(withURL:) result = \(url2)")
// Now do similar calls outside of the function
let pathFromURL1 = url1.path
var badURLNowGood = URL(fileURLWithPath: pathFromURL1)
let goodURLUsingString = URL(fileURLWithPath: "/Dir1/file.txt")
print("main: badURLNowGood = \(badURLNowGood)") // Breakpoint here
print("main: goodURLUsingString = \(goodURLUsingString)")