stringByAppendingPathComponent를 사용할 수 없습니다


132

내 앱은 Instagram에서 사진을 공유하므로 먼저 임시 디렉토리에 저장합니다.

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

작업 중이 Swift 1.2었지만 작동하지 않습니다 Swift 2.0.

주어진 오류 메시지는 다음과 같습니다.

stringByAppendingPathComponent를 사용할 수 없습니다. 대신 NSURL에서 URLByAppendingPathComponent를 사용하십시오.

답변:


145

stringByAppendingPathComponentSwift 2.0에서 메소드 가 제거 된 것처럼 보이 므로 오류 메시지에서 제안하는 것은 다음을 사용하는 것입니다.

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

최신 정보:

URLByAppendingPathComponent()appendingPathComponent()대신 다음과 같이 대체되었습니다 .

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

이 디자인을 사용한다면 공간을 % 20으로 변환하는 것과 같은 문제가 생길 것입니다Application%20Support
Roman

아니오, Swift 2.0은 사용할 수 있습니다 stringByAppendingPathComponent. 아래 답변을 참조하십시오.
Jeffrey Neo

2
@JeffreyNeo 네, 그러나 그것은 NSURL방법이 아니라NSString
Dániel Nagy

@ DánielNagy 나는 당신이 " stringByAppendingPathComponentSwift 2.0에서 제거되었습니다 "라는 말이 맞지 않다는 것을 의미 하며 @Maysam은 NSURL방법 만을 요구하지 않았습니다 .
Jeffrey Neo

4
@JeffreyNeo 실제로 Swift 1.2의 String에는 stringByAppendingPathComponent라는 메소드가 있었지만 Swift 2.0의 String은 그렇지 않기 때문에 정확합니다. NSString은 Swift 언어의 일부가 아니며 Foundation 프레임 워크의 일부입니다.
Dániel Nagy 2016 년

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가 있습니다. 자원을 찾기위한 경로를 사용하는 것이 더 이상 사용되지 않으므로 대신 사용해야합니다. 그냥 말하면
Charlie Monroe

snippet : String (NSString (string : path) .stringByAppendingPathComponent (imageName)) ... 그렇지 않으면 @CharlieMonroe
Bobjt

1
@CharlieMonroe 그렇다면 실제로 SDK에서 URL을 경로로 허용하지 않는 많은 메소드가 여전히 있습니까?
Joris Mans

@JorisMans 이들은 일반적으로 오래된 방법입니다 (10.0 이후 또는 이후에 사용 가능). 샌드 박싱이 도입 된 이후로 appscope bookmark와 같은 경로를 전달할 수있는 방법은 없습니다. 대신 URL이 필요합니다. Apple은 소수의 사람들 만 사용하는 API 업데이트 속도가 느립니다. 또는 최근에 추가 한 API (최근 3-4 년)의 예가 있습니까?
Charlie Monroe

1
@IulianOnofrei - 사용해야하기 때문에 checkResourceIsReachable()checkPromisedItemIsReachable()URL대신. FileManager여전히 Swift에 NSFileManager대해 NS접두사가 제거 된 ObjC 클래스 이며 fileExistsAtPathOS X 10.0 이후로 사용되었습니다. 그 이후 세계는 진화했으며 앱이 샌드 박스 처리되어 있기 때문에 (iOS에서는 덜 분명함) 파일이 존재할 수 있으며 파일을 볼 권한이 없을 수도 있습니다. 또한 파일이 클라우드 등에있을 수 있습니다. 따라서 간단한 BOOL방법이보다 복잡한 방법으로 대체 URL되지만 의미 론적으로 올바른 이유 입니다.
Charlie Monroe

30

문자열을로 감싸십시오 NSString.

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

멋진 하나 .. String클래스는 없어도 NSString존재합니다! 말이된다.
preetam

16

에 대한 스위프트 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

스위프트 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

스위프트 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

다음을 수행하십시오.

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

0

나는 이것을 시도하고 문제를 해결했다.

전에:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

후:

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

-1

URL 메소드 NSString대신 경로 메소드를 사용할 수 있으면 계산 된 특성 또는 값을 리턴 하는 메소드를 확장 하여 원하는 메소드를 확장 하는 String것이 훨씬 쉽습니다 .StringNSStringString

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

그리고:

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

-2

스위프트 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)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.