如何在 .playground 中写入文件?
How writeToFile in a .playground?
我编辑了一个 .plist
文件。我是如何理解的:由于沙盒,只能读取 Resources
目录中 .playgrounds
文件中的文件。但是怎么可能把编辑好的文件写入这个文件夹呢?
// read file
let xmlPath: String = NSBundle.mainBundle().pathForResource("Settings", ofType: "plist")!
var xmlDictionary: [String : AnyObject] = NSDictionary(contentsOfFile: xmlPath) as Dictionary<String, AnyObject>
// editing file
// ...
// saving file
let saveDict: NSDictionary = xmlDictionary as NSDictionary
let savePath: String = xmlPath.stringByDeletingLastPathComponent.stringByAppendingPathComponent("Saved.plist")
saveDict.writeToFile(savePath, atomically: false) // ~> false
无论 savePath
还是 xmlPath
都有效,returns false
意味着 没有成功 。
如果我能替换旧的(未编辑的)版本的 .plist
文件就好了,但是保存到新文件也可以。
似乎无法修改主包中的文件,see earlier question。您可以做的是保存到沙盒应用程序文件夹,可以像这样检索其 URL:
func applicationDirectory(directory:NSSearchPathDirectory) -> NSURL? {
var appDirectory:String?
var paths:[AnyObject] = NSSearchPathForDirectoriesInDomains(directory, NSSearchPathDomainMask.UserDomainMask, true);
if paths.count > 0 {
if let pathString = paths[0] as? String {
appDirectory = pathString
}
}
if let dD = appDirectory {
return NSURL(string:dD)
}
return nil
}
func applicationTemporaryDirectory() -> NSURL? {
if let tD = NSTemporaryDirectory() {
return NSURL(string:tD)
}
return nil
}
applicationTemporaryDirectory()
applicationDirectory(NSSearchPathDirectory.DocumentDirectory)
url 将显示在 playground 的右侧,然后只需复制并粘贴到 Finder -> Go -> Go to Folder 对话框中即可。
GitHub Repo: 有关完整的工作示例,请参阅此 GitHub repo。
可以。
通过查看其源代码,使用您当前的 plist
作为模板。
然后赋值给一个字符串
let newPlist: String =
"""
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2020 YourName. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
<key>TDAMERITRADE_API_KEY</key>
<string></string>
<key>ACCOUNT_ID</key>
<string></string>
<key>CFBundleURLSchemes</key>
<string>YourName.YourProjName</string>
</dict>
</plist>
"""
然后使用 url.
的 filePath 在字符串上调用 write 方法
let url: URL = URL(fileURLWithPath: "/Users/username/Desktop/iOS/YourProj/YourProj/info.plist")
newPlist.write(to: url, atomically: true, encoding: .utf8)
我编辑了一个 .plist
文件。我是如何理解的:由于沙盒,只能读取 Resources
目录中 .playgrounds
文件中的文件。但是怎么可能把编辑好的文件写入这个文件夹呢?
// read file
let xmlPath: String = NSBundle.mainBundle().pathForResource("Settings", ofType: "plist")!
var xmlDictionary: [String : AnyObject] = NSDictionary(contentsOfFile: xmlPath) as Dictionary<String, AnyObject>
// editing file
// ...
// saving file
let saveDict: NSDictionary = xmlDictionary as NSDictionary
let savePath: String = xmlPath.stringByDeletingLastPathComponent.stringByAppendingPathComponent("Saved.plist")
saveDict.writeToFile(savePath, atomically: false) // ~> false
无论 savePath
还是 xmlPath
都有效,returns false
意味着 没有成功 。
如果我能替换旧的(未编辑的)版本的 .plist
文件就好了,但是保存到新文件也可以。
似乎无法修改主包中的文件,see earlier question。您可以做的是保存到沙盒应用程序文件夹,可以像这样检索其 URL:
func applicationDirectory(directory:NSSearchPathDirectory) -> NSURL? {
var appDirectory:String?
var paths:[AnyObject] = NSSearchPathForDirectoriesInDomains(directory, NSSearchPathDomainMask.UserDomainMask, true);
if paths.count > 0 {
if let pathString = paths[0] as? String {
appDirectory = pathString
}
}
if let dD = appDirectory {
return NSURL(string:dD)
}
return nil
}
func applicationTemporaryDirectory() -> NSURL? {
if let tD = NSTemporaryDirectory() {
return NSURL(string:tD)
}
return nil
}
applicationTemporaryDirectory()
applicationDirectory(NSSearchPathDirectory.DocumentDirectory)
url 将显示在 playground 的右侧,然后只需复制并粘贴到 Finder -> Go -> Go to Folder 对话框中即可。
GitHub Repo: 有关完整的工作示例,请参阅此 GitHub repo。
可以。
通过查看其源代码,使用您当前的 plist
作为模板。
然后赋值给一个字符串
let newPlist: String =
"""
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2020 YourName. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
<key>TDAMERITRADE_API_KEY</key>
<string></string>
<key>ACCOUNT_ID</key>
<string></string>
<key>CFBundleURLSchemes</key>
<string>YourName.YourProjName</string>
</dict>
</plist>
"""
然后使用 url.
的 filePath 在字符串上调用 write 方法let url: URL = URL(fileURLWithPath: "/Users/username/Desktop/iOS/YourProj/YourProj/info.plist")
newPlist.write(to: url, atomically: true, encoding: .utf8)