Moja aplikacja udostępnia zdjęcie na Instagramie, aby to zrobić, najpierw zapisuje je w katalogu tymczasowym:
let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
Pracował Swift 1.2
, ale nie działa Swift 2.0
.
Podany komunikat o błędzie to:
stringByAppendingPathComponent jest niedostępny: zamiast tego użyj URLByAppendingPathComponent na NSURL.
Application%20Support
stringByAppendingPathComponent
, zobacz moją odpowiedź poniżej.NSURL
metoda, aleNSString
stringByAppendingPathComponent
zostało usunięte w Swift 2.0” nie jest poprawne, a @Maysam nie pytał o jedynąNSURL
metodę.To działa,
NSString
więc możesz go używać w następujący sposób:extension String { func stringByAppendingPathComponent(path: String) -> String { let nsSt = self as NSString return nsSt.stringByAppendingPathComponent(path) } }
Teraz możesz użyć tego rozszerzenia, które najpierw skonwertuje twoje
String
na,NSString
a następnie wykona operację.Twój kod będzie wyglądał następująco:
let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
Oto kilka innych metod użycia:
extension String { var lastPathComponent: String { return (self as NSString).lastPathComponent } var pathExtension: String { return (self as NSString).pathExtension } var stringByDeletingLastPathComponent: String { return (self as NSString).stringByDeletingLastPathComponent } var stringByDeletingPathExtension: String { return (self as NSString).stringByDeletingPathExtension } var pathComponents: [String] { return (self as NSString).pathComponents } func stringByAppendingPathComponent(path: String) -> String { let nsSt = self as NSString return nsSt.stringByAppendingPathComponent(path) } func stringByAppendingPathExtension(ext: String) -> String? { let nsSt = self as NSString return nsSt.stringByAppendingPathExtension(ext) } }
Odniesienie z TUTAJ .
Dla Swift 3.0:
extension String { func stringByAppendingPathComponent1(path: String) -> String { let nsSt = self as NSString return nsSt.appendingPathComponent(path) } } let writePath = NSTemporaryDirectory().stringByAppendingPathComponent(path: "instagram.igo") extension String { var lastPathComponent: String { return (self as NSString).lastPathComponent } var pathExtension: String { return (self as NSString).pathExtension } var stringByDeletingLastPathComponent: String { return (self as NSString).deletingLastPathComponent } var stringByDeletingPathExtension: String { return (self as NSString).deletingPathExtension } var pathComponents: [String] { return (self as NSString).pathComponents } func stringByAppendingPathComponent(path: String) -> String { let nsSt = self as NSString return nsSt.appendingPathComponent(path) } func stringByAppendingPathExtension(ext: String) -> String? { let nsSt = self as NSString return nsSt.appendingPathExtension(ext) } }
źródło
NSURL
zamiast tego należy używać s. Tylko mówię.checkResourceIsReachable()
albocheckPromisedItemIsReachable()
naURL
zamiast.FileManager
jest nadal klasą ObjCNSFileManager
zNS
usuniętym przedrostkiem dla Swift ifileExistsAtPath
istniała od czasu OS X 10.0. Świat ewoluował od tego czasu, a ponieważ aplikacje są piaskownicą (co jest mniej oczywiste w iOS), plik może istnieć, po prostu możesz nie mieć uprawnień do jego przeglądania; plik może również znajdować się w chmurze itp. Dlatego prostąBOOL
metodę zastępuje się czymś bardziej złożonymURL
, ale poprawnym semantycznie.Po prostu zawiń swój sznurek jako
NSString
.let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")
źródło
String
klasa nie ma tego, aleNSString
istnieje! ma sens.dla Swift 3 :
let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path
lub lepiej utwórz to rozszerzenie:
extension String { func appendingPathComponent(_ string: String) -> String { return URL(fileURLWithPath: self).appendingPathComponent(string).path } }
stosowanie:
let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)
źródło
Rozwiązanie Swift 3:
Oto funkcja pozwalająca uzyskać ścieżkę do katalogu dokumentów-
func getDocumentsDirectory() -> URL { let paths = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask) let documentsDirectory = paths[0] return documentsDirectory }
Jak używać:
getDocumentsDirectory.appendingPathComponent("google.com")
Wynik:
file:///var/folders/w1/3rcp2fvs1qv43hfsh5876s0h0000gn/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.MyPlayground-7CF9F706-509C-4D4C-997E-AB8FE9E4A6EA/Documents/google.com
źródło
Dla Swift 2.0
// Get the documents Directory func documentsDirectory() -> String { let documentsFolderPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] return documentsFolderPath } // Get path for a file in the directory func fileInDocumentsDirectory(filename: String) -> String { let writePath = (documentsDirectory() as NSString).stringByAppendingPathComponent("Mobile") if (!NSFileManager.defaultManager().fileExistsAtPath(writePath)) { do { try NSFileManager.defaultManager().createDirectoryAtPath(writePath, withIntermediateDirectories: false, attributes: nil) } catch let error as NSError { print(error.localizedDescription); } } return (writePath as NSString).stringByAppendingPathComponent(filename) } //# MARK: - Save Image in Doc dir func saveImage (image: UIImage, path: String ) -> Bool{ let pngImageData = UIImagePNGRepresentation(image) // let jpgImageData = UIImageJPEGRepresentation(image, 1.0) // if you want to save as JPEG let result = pngImageData!.writeToFile(path, atomically: true) print("\(result)") print("\(path)") return result }
źródło
Zamiast tego można użyć metody URLByAppendingPathComponent (). Pamiętaj, że powinieneś przyciąć ciąg ścieżki, aby usunąć prefiks „file: //”:
let uniqueFileName = NSUUID().UUIDString let documentsDirectory = getDocumentsDirectoryURL() if let path = documentsDirectory?.URLByAppendingPathComponent(uniqueFileName) { var pathString = path.absoluteString pathString = imagePathString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "file://")) } func getDocumentsDirectoryURL() -> NSURL? { let fileManager = NSFileManager() if let docsDirectory = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first { return docsDirectory } return nil }
źródło
Wykonaj następujące czynności:
(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension
źródło
Spróbowałem tego i to rozwiązało problem.
przed:
let localPath = documentDirectory.URLByAppendingPathComponent(imageName)
po:
let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)
źródło
Jeśli użycie
NSString
metod ścieżkowych (zamiastString
metod URL) jest dopuszczalne, znacznie łatwiej jest rozszerzyćString
o właściwość obliczoną lub metodę zwracającą jej wartość jakoNSString
(zamiast powielać żądane metody wString
rozszerzeniu):extension String { var ns: NSString { return self as NSString } }
i wtedy:
swiftStringPath.ns.appendingPathComponent("whateva") swiftStringPath.ns.deletingPathExtension
źródło
Szybki 4
extension String { var lastPathComponent: String { return (self as NSString).lastPathComponent } var pathExtension: String { return (self as NSString).pathExtension } var stringByDeletingLastPathComponent: String { return (self as NSString).deletingLastPathComponent } var stringByDeletingPathExtension: String { return (self as NSString).deletingPathExtension } var pathComponents: [String] { return (self as NSString).pathComponents } func stringByAppendingPathComponent(path: String) -> String { let nsSt = self as NSString return nsSt.appendingPathComponent(path) } func stringByAppendingPathExtension(ext: String) -> String? { let nsSt = self as NSString return nsSt.appendingPathExtension(ext) } }
źródło