Swift: URL (fileURLWithPath :) не возвращает значения вообще, даже ноль - PullRequest
1 голос
/ 26 сентября 2019

Я получаю странный результат, где URL(fileURLWithPath:) не возвращает значения при вызове определенным образом.Ниже приведен код (простой инструмент командной строки macOS), чтобы проиллюстрировать эту проблему.

Я использую Xcode 10.3 в macOS 10.14.6.Это также происходит на iOS 12.4.1.

Чтобы увидеть проблему, запустите приведенный ниже код.Поместите точку останова в оператор return в функции weirdStuff(withURL:) и в строку со 2-й по последнюю.Запустите приложение и, когда код разбит на строке return, наведите указатель на 4 let s в функции, чтобы проверить их значения.Вот что странно:

  1. badURL не будет показывать никакого значения вообще!А панель «Просмотр переменных» консоли отладки покажет, что значение не было определено.
  2. 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)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...