stringByAppendingPathComponent недоступен


132

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

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

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

Данное сообщение об ошибке:

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

Ответы:


145

Похоже, что stringByAppendingPathComponentв Swift 2.0 этот метод удален, поэтому в сообщении об ошибке предлагается использовать:

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

Обновить:

URLByAppendingPathComponent()был заменен на appendingPathComponent()так:

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

если вы собираетесь использовать этот дизайн, у вас будут проблемы, такие как преобразование пространства в% 20Application%20Support
Роман

нет, Swift 2.0 можно использовать stringByAppendingPathComponent, см. мой ответ ниже.
Джеффри Нео

2
@JeffreyNeo, да, но это не NSURLметод, аNSString
Даниэль Надь

@ DánielNagy Я имею в виду, что вы сказали, что « stringByAppendingPathComponentудалено в Swift 2.0» неверно, и @Maysam не запрашивал единственный NSURLметод.
Джеффри Нео

4
@JeffreyNeo, на самом деле, это правильно, поскольку в String в Swift 1.2 был метод под названием stringByAppendingPathComponent, а в String в Swift 2.0 - нет. И NSString не является частью языка Swift, это часть структуры Foundation.
Даниэль Надь

75

Он работает, 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)  
    }  
}

Ссылка ЗДЕСЬ .

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

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

snippet: String (NSString (string: path) .stringByAppendingPathComponent (imageName)) ... в остальном, вполне согласен с @CharlieMonroe
Bobjt

1
@CharlieMonroe, если это действительно так, почему в SDK до сих пор есть несколько методов, которые не принимают URL-адрес в качестве пути?
Joris Mans

@JorisMans Обычно это более старые методы (доступны с 10.0 или раньше). С тех пор, как была введена песочница, нет возможности передать путь, например, с помощью закладки appscope - вместо этого вам нужен URL-адрес. Apple медленно обновляет API-интерфейсы, которыми пользуются немногие. Или у вас есть пример недавно добавленного API (последние 3-4 года)?
Чарли Монро

1
@IulianOnofrei - Потому что вы должны использовать checkResourceIsReachable()или checkPromisedItemIsReachable()на URLвместо. FileManagerпо-прежнему является классом ObjC NSFileManagerс NSудаленным префиксом для Swift и fileExistsAtPathсуществует с OS X 10.0. С тех пор мир изменился, и поскольку приложения изолированы в песочнице (что менее очевидно в iOS), файл может существовать, но у вас может просто не быть разрешения на его просмотр; кроме того, файл может находиться в облаке и т. д. Вот почему простой BOOLметод заменяется чем-то более сложным URL, но более семантически правильным.
Чарли Монро

30

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

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

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

16

для 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)

6

Решение Swift 3:

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

    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

5

Для 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

}

2

Вместо этого вы можете использовать URLByAppendingPathComponent (). Обратите внимание, что вам следует обрезать строку пути, чтобы удалить префикс «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
}


0

Я попробовал это, и проблема была решена.

перед:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

после:

let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)

-1

Если использование NSStringметодов пути (вместо Stringметодов URL) допустимо, гораздо проще расширить Stringего вычисляемым свойством или методом, возвращающим его значение как NSString(вместо дублирования желаемых методов в Stringрасширении):

extension String
{
    var ns: NSString { return self as NSString }
}

а потом:

swiftStringPath.ns.appendingPathComponent("whateva")
swiftStringPath.ns.deletingPathExtension

-2

Swift 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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.