Próbuję uzyskać ścieżkę do folderu Dokumenty z kodem:
var documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory:0,NSSearchPathDomainMask:0,true)
ale Xcode daje błąd: Cannot convert expression's type 'AnyObject[]!' to type 'NSSearchPathDirectory'
Próbuję zrozumieć, co jest nie tak w kodzie.
ios
swift
nsdocumentdirectory
Ivan R.
źródło
źródło
Odpowiedzi:
Najwyraźniej kompilator uważa, że
NSSearchPathDirectory:0
jest tablicą i oczywiście oczekujeNSSearchPathDirectory
zamiast tego typu . Z pewnością nie jest to pomocny komunikat o błędzie.Ale co do powodów:
Po pierwsze, mylisz nazwy i typy argumentów. Spójrz na definicję funkcji:
directory
idomainMask
są nazwami, używasz typów, ale i tak powinieneś je pominąć dla funkcji. Stosowane są przede wszystkim w metodach.To pozostawia nam (zaktualizowane do Swift 2.0):
a dla Swift 3:
źródło
NSString
raczej do niżString
.String
działa w Xcode 6.0 i 6.1. Ogólnie rzecz biorąc,String
iNSString
są zmostkowane automatycznie w Swift. Może musiałeś rzucić naNSString
z innego powodu.String
na placu zabaw, ale nie w aplikacji. Sprawdź pytanie ( stackoverflow.com/questions/26450003/… )/var/mobile/Containers/Data/Application/9E18A573-6429-434D-9B42-08642B643970/Documents
(2)/var/mobile/Containers/Data/Application/77C8EA95-B77A-474D-8522-1F24F854A291/Documents
Swift 3.0 i 4.0
Bezpośrednie pobranie pierwszego elementu z tablicy może potencjalnie spowodować wyjątek, jeśli ścieżka nie zostanie znaleziona. Dlatego
first
lepszym rozwiązaniem jest wywołanie, a następnie rozpakowanieźródło
Nowoczesne zalecenie polega na używaniu adresów NSURL dla plików i katalogów zamiast ścieżek opartych na NSString:
Aby więc pobrać katalog dokumentów dla aplikacji jako identyfikator NSURL:
Ma to podstawową obsługę błędów, ponieważ zależy to od tego, co zrobi twoja aplikacja w takich przypadkach. Ale to wykorzystuje adresy URL plików i nowocześniejszy interfejs API, aby zwrócić adres URL bazy danych, kopiując początkową wersję z pakietu, jeśli jeszcze nie istnieje, lub zerową w przypadku błędu.
źródło
Xcode 8.2.1 • Swift 3.0.2
Xcode 7.1.1 • Swift 2.1
źródło
Zwykle wolę używać tego rozszerzenia:
Swift 3.x oraz Swift 4.0 :
Swift 2.x :
źródło
let path = FileManager.documentsDir()+("/"+"\(fileName)")
możesz ją wywołać bez różnic między wątkiem (głównym lub w tle).Dla każdego, kto szuka przykładu, który działa ze Swift 2.2, kod Abizern z nowoczesnym, spróbuj złapać uchwyt błędu
Aktualizacja Brakowało mi, że nowy Swift 2.0 ma osłonę (Ruby, chyba że analog), więc z osłoną jest znacznie krótszy i bardziej czytelny
źródło
Bardziej wygodna metoda Swift 3 :
źródło
FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
Xcode 8b4 Swift 3.0.0
źródło
Zwykle wolę jak poniżej w Swift 3 , ponieważ mogę dodać nazwę pliku i łatwo utworzyć plik
źródło
absoluteString
jest źle. aby uzyskać ścieżkę do pliku adresURL, musisz uzyskać jego.path
własność