【问题标题】:Why can't I use write(toFile: ) property on a string?为什么我不能在字符串上使用 write(toFile: ) 属性?
【发布时间】:2016-12-08 21:12:58
【问题描述】:

我正在学习一个用早期版本的 Swift 编写的教程,它教我如何在 Swift3 中读取/写入 .txt 文件。到目前为止,Xcode 一直做得很好,可以让我知道何时使用旧语法,并为我将其更改为最新语法。但是,我遇到了一些适用于旧版本 Swift 的东西,但不是当前版本。

class ViewController: UIViewController {

    // MARK: Properties

    @IBOutlet weak var monthToEditTextField: UITextField!
    @IBOutlet weak var bedTimeTextField: UITextField!
    @IBOutlet weak var wakeTimeTextField: UITextField!
    @IBOutlet weak var theLabel: UILabel!

    @IBAction func saveButton(_ sender: UIButton)
    {
        var theMonth = monthToEditTextField.text
        var bedTime = bedTimeTextField.text
        var wakeTime = wakeTimeTextField.text

        var stringForTXTFile = "The user's info is: \(theMonth), \(bedTime), \(wakeTime)"

        let fileManager = FileManager.default

        if (!fileManager.fileExists(atPath: filePath))
        {
            var writeError: NSError?
            let fileToBeWritten = stringForTXTFile.write(toFile: // This is where the problem is
        }   
    }

当我输入时

stringForTXTFile.write

我收到此错误框

我需要做什么才能使用“write”属性?

【问题讨论】:

    标签: properties swift3 writetofile


    【解决方案1】:

    在 Swift3 中写入文件不再返回 Bool。它抛出,所以只需删除let fileToBeWritten = 并使用do try catch error 处理。如果操作成功则需要运行的任何代码都需要放在 do try 大括号内。您还可以使用guard 来解开您的文本字段可选字符串。试试这样:

    import UIKit
    
    class ViewController: UIViewController {
        @IBOutlet weak var monthToEditTextField: UITextField!
        @IBOutlet weak var bedTimeTextField: UITextField!
        @IBOutlet weak var wakeTimeTextField: UITextField!
        @IBOutlet weak var theLabel: UILabel!
        let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("textFile.txt")
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        @IBAction func save(_ sender: UIButton) {
            guard
                let theMonth = monthToEditTextField.text,
                let bedTime = bedTimeTextField.text,
                let wakeTime = wakeTimeTextField.text
                else { return }
    
            let stringForTXTFile = "The user's info is: \(theMonth), \(bedTime), \(wakeTime)"
                do {
                    try stringForTXTFile.write(toFile: fileURL.path, atomically: true, encoding: .utf8)
                    // place code to be executed here if write was successful
                } catch {
                    print(error.localizedDescription)
                }
        }
    
        @IBAction func load(_ sender: UIButton) {
            do {
                theLabel.text = try String(contentsOf: fileURL)
            } catch {
                print(error.localizedDescription)
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助。但是,由于我遵循的是过时的教程,所以我现在意识到第二部分也不起作用(因此无法检查您的代码是否有效/回答了我的问题)。本教程的第二部分展示了如何使用按钮和标签显示 .txt 文件信息。您能否提供一种读取文件的方法,以便我可以在标签中显示内容?
    • @Theodore.K 你可以试试这个示例文件dropbox.com/s/f3pq67n6mm9r2um/SavingLoadingText.zip?dl=1
    • 效果很好。现在我需要学习如何将文档保存到在线 URL
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多