gpt4 book ai didi

iOS 9 - Swift - 将数据写入 FileStorage - 每个字段的前缀为 "Optional"

转载 作者:行者123 更新时间:2023-11-29 01:30:34 24 4
gpt4 key购买 nike

尝试将数据从 UI 写入 IOS 文件存储:

 @IBAction func savetoFile(sender: AnyObject) {
let csvLine:String="\(bookName.text), \(bookAuthor.text),\(bookIsbn.text)\n"
let paths = NSSearchPathForDirectoriesInDomains(
NSSearchPathDirectory.DocumentDirectory,
NSSearchPathDomainMask.UserDomainMask, true)
let docDir:String=paths[0] as String
let bookFile:String=(docDir as NSString).stringByAppendingPathComponent("bookresults.dat")

if !NSFileManager.defaultManager().fileExistsAtPath(bookFile) {
NSFileManager.defaultManager().createFileAtPath(bookFile,
contents: nil, attributes: nil)
}

let fileHandle:NSFileHandle=NSFileHandle(forUpdatingAtPath:bookFile)!
fileHandle.seekToEndOfFile()
fileHandle.writeData(csvLine.dataUsingEncoding(NSUTF8StringEncoding)!)
fileHandle.closeFile()

问题:

如果我给出“BookOne”,程序将作为“Optional("BookOne")”写入文件,并为每个字段、每一行重复此“Optional”。

如果有人可以与此问题的代码共享修复程序,我们将不胜感激。

技术栈是 Xcode 7.1 和 SWIFT。

谢谢

最佳答案

如果 foo 是一个可选类型(例如 String?),那么字符串插值会将烦人的 Optional(...)包裹它。 (这是 IMO 的语言设计错误——插值应该自动展开或不接受可选值——但 Apple 按照他们的方式做到了!)

要摆脱 Optional(...),您需要使 \() 中的内容不是可选的。有很多方法可以做到这一点。

一种是使用默认值:

"\(bookName.text ?? ""), \(bookAuthor.text ?? ""), etc"

(假设您希望 nil 作为空字符串出现。)

表达式 bookName.text ?? "" 不能计算为 nil,所以它的类型是 String 而不是 String?,并且 Optional(...) wrapper 消失了。你甚至可以把它放在一个助手中:

func emptyIfNil(string: String?) -> String {
return string ?? ""
}

"\(emptyIfNil(bookName.text)), \(emptyIfNil(bookAuthor.text)), etc"

另一种方法是使用 if let 来解包可选值:

if let name = bookNext.text, let author = bookAuthor.text, ...etc... {
let csvLine:String="\(name), \(author),\(isbn)\n"
...
}

这只会输出所有值都存在的行。

在您的案例中,一种简洁的方法是使用序列操作,并完全避免插值:

let csvLine = [bookName, bookAuthor, bookIsbn]
.map { $0.text ?? "" }
.joinWithSeparator(",")

我强烈建议不要使用 ! 在这种(以及大多数)情况下解包可选值。说 bookName.text! 意味着,“如果 bookName.text 为 nil,那将是一场可怕的灾难,最好的办法就是让整个应用程序崩溃。”如果在 bookName.text 为 nil 的情况下有任何合理的行为——我想在你的情况下有——那么你应该为它编码而不是允许这种可能性那次事故。

关于iOS 9 - Swift - 将数据写入 FileStorage - 每个字段的前缀为 "Optional",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com