ios stringByAppendingPathComponent 不可用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/32501627/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
stringByAppendingPathComponent is unavailable
提问by Maysam
My app shares photo on Instagram, to do this it first saves it on a temporary directory:
我的应用程序在 Instagram 上分享照片,为此它首先将它保存在一个临时目录中:
let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
It was working on Swift 1.2
, but does not work on Swift 2.0
.
它正在工作Swift 1.2
,但不工作Swift 2.0
。
Given error message is:
给定的错误信息是:
stringByAppendingPathComponent is unavailable: use URLByAppendingPathComponent on NSURL instead.
stringByAppendingPathComponent 不可用:在 NSURL 上使用 URLByAppendingPathComponent 代替。
回答by Dániel Nagy
It looks like the method stringByAppendingPathComponent
is removed in Swift 2.0, so what the error message suggests is to use:
看起来该方法stringByAppendingPathComponent
已在 Swift 2.0 中删除,因此错误消息建议使用:
let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("instagram.igo")
Update:
更新:
URLByAppendingPathComponent()
has been replaced by appendingPathComponent()
so instead do:
URLByAppendingPathComponent()
已被替换为appendingPathComponent()
所以改为:
let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo")
回答by Dharmesh Kheni
It is working for NSString
so you can use it like this:
它正在工作,NSString
因此您可以像这样使用它:
extension String {
func stringByAppendingPathComponent(path: String) -> String {
let nsSt = self as NSString
return nsSt.stringByAppendingPathComponent(path)
}
}
Now you can use this extension which will convert your String
to NSString
first and then perform operation.
现在您可以使用此扩展程序,它将首先转换String
为NSString
,然后执行操作。
And your code will be:
你的代码将是:
let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
Here is some another methods for use:
下面是一些其他的使用方法:
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)
}
}
Reference from HERE.
从这里参考。
For swift 3.0:
对于 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)
}
}
回答by Jeffrey Neo
Simply wrap your string as NSString
.
只需将您的字符串包装为NSString
.
let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")
回答by Vyacheslav
for Swift 3:
对于Swift 3:
let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path
or better create this extension:
或者更好地创建这个扩展:
extension String {
func appendingPathComponent(_ string: String) -> String {
return URL(fileURLWithPath: self).appendingPathComponent(string).path
}
}
usage:
用法:
let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)
回答by Revanth
Swift 3 Solution:
斯威夫特 3 解决方案:
Here is a function to get the documents directory path-
这是一个获取文档目录路径的函数-
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
How to use:
如何使用:
getDocumentsDirectory.appendingPathComponent("google.com")
Result:
结果:
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
回答by Mehul Chuahan
For swift 2.0
快速 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
}
回答by user2374993 - Inbal Tish
You can use URLByAppendingPathComponent() instead. Please note that you should trim the path string to remove “file://“ prefix:
您可以改用 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
}
回答by Mauro Delazeri
Do the following:
请执行下列操作:
(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension
回答by Anna S.
I tried this and it solved the problem.
我试过了,它解决了这个问题。
before:
前:
let localPath = documentDirectory.URLByAppendingPathComponent(imageName)
after:
后:
let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)
回答by Russian
If using NSString
path methods (instead of String
URL methods) is acceptable, it's much easier to extend String
with a computed property or a method returning its value as NSString
(instead of duplicating the desired methods in String
extension):
如果使用NSString
路径方法(而不是String
URL 方法)是可以接受的,那么String
使用计算属性或返回其值的方法NSString
(而不是在String
扩展中复制所需的方法)更容易扩展:
extension String
{
var ns: NSString { return self as NSString }
}
and then:
进而:
swiftStringPath.ns.appendingPathComponent("whateva")
swiftStringPath.ns.deletingPathExtension