2015-09-10 4 views
110

Моих приложений акций фото на Instagram, чтобы это сделать его первым сохраняет его во временном каталоге:stringByAppendingPathComponent недоступно

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo") 

Он работал на Swift 1.2, но не работает на Swift 2.0.

Учитывая сообщение об ошибке:

stringByAppendingPathComponent недоступен: используйте URLByAppendingPathComponent на NSURL вместо этого.

ответ

122

Он выглядит как метод stringByAppendingPathComponent удаляется в Swift 2.0, так что сообщение об ошибке наводит на мысль заключается в использовании:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("instagram.igo") 

Update:

URLByAppendingPathComponent() был заменен на appendingPathComponent(), поэтому вместо этого:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo") 
+0

Если вы собираетесь использовать этот дизайн, у вас будут проблемы, такие как преобразование пространства в% 20 'Приложение% 20Support' – Roman

+0

нет, Swift 2.0 может использовать' stringByAppendingPathComponent', см. Мой ответ ниже. –

+2

@JeffreyNeo да, но это не метод 'NSURL', а' NSString' –

63

Это работает для NSString, так что вы можете использовать его как это:

extension String { 
    func stringByAppendingPathComponent(path: String) -> String { 
     let nsSt = self as NSString 
     return nsSt.stringByAppendingPathComponent(path) 
    } 
} 

Теперь вы можете использовать это расширение, которое преобразует ваш String в NSString первый, а затем выполнить операцию.

И ваш код будет:

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("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).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) 
    } 
} 

Справка из HERE.

Для быстрой версии 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) 
    } 
} 
+0

Спасибо, кстати. – Maysam

+11

Хотя это допустимое решение, есть причина, по которой Apple удалила эти методы - использование путей для поиска ресурсов устарело, и вместо этого следует использовать NSURL'. Просто говорю. –

+0

snippet: String (NSString (строка: путь) .stringByAppendingPathComponent (imageName)) ... в противном случае вполне согласен с @CharlieMonroe – Bobjt

27

Просто оберните свою строку как NSString.

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo") 
+0

классный класс .. 'String' не имеет этого, но' NSString' существует! имеет смысл. – preetam

0

Выполните следующие действия:

(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension 
5

Для быстры 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 

} 
2

Вы можете использовать URLByAppendingPathComponent() вместо этого.Обратите внимание, что вы должны обрезать строку пути, чтобы удалить «файл: //» префикс:

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 
} 
11

для Swift 3:

let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path 

или лучше создать это расширение:

extension String { 
    func appendingPathComponent(_ string: String) -> String { 
     return URL(fileURLWithPath: self).appendingPathComponent(string).path 
    } 
} 

использование:

let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname) 
+0

УДАЛИТЬ этот ответ - «http: // some_url» станет «/ some_url» – Gargo

6

Swift 3 Решение:

Вот функция, чтобы получить каталог документов path-

func getDocumentsDirectory() -> URL { 
     let paths = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask) 
     let documentsDirectory = paths[0] 
     return documentsDirectory 
    } 

Как использовать:

getDocumentsDirectory.appendingPathComponent("google.com") 

Результат:

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 
Смежные вопросы