在Swift类中打开文件时处理错误的最佳实践?

时间:2016-01-05 14:56:39

标签: swift

这两种方法适用于在类中打开文件并处理可能的错误,实现的对象需要在try块之外保留:

class Thing1 {   
    var text: String = "" 

    init() {}    

    func load() throws {
        text = try String( contentsOfFile: "/Users/me/text.txt", encoding: NSUTF8StringEncoding )
    }
}

let myThing1 = Thing1() // create an empty object

do {
    try myThing1.load() } // then load it with the file
catch let error as NSError {
    // do something with error
}

class Thing2 {   
    let text: String // text is loaded once, used only once
    var errorString: String?

    init() {      
        do {
            text = try String( contentsOfFile: "/Users/me/text.txt", encoding: NSUTF8StringEncoding )
        } catch let error as NSError {
            errorString = error.description
            text = ""
        }
    }

    func error() -> String? {
        return errorString
    }  
}

let myThing2 = Thing2()

if myThing2.error() != nil {
    // do something with errorString = myThing2!.error()
}

从我编写C ++的日子开始,更安全的方式通常是第一个,但是对于一个会在try块之外持久存在的对象,实现要求在加载文件之前必须进行初始化。使用Swift中的选项,第二种方法变得可能,另外的优点是 text 的处理方式就像常量一样。但是,错误处理是以非标准的类代码相关的方式执行的,这似乎不太安全。

我问的是这个问题,因为我所有使用这个课程的代码都取决于这个设计决定,我是Swift的新手,而且我不知道它是如何工作的“引擎盖”。任何意见,将不胜感激。由于我对Swift的新见​​,我看不到的替代方法也将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用这两种形式。这取决于更好的背景。

例如,如果您在一个抛出错误的函数中使用该调用,则抛出方法更方便。如果错误描述不重要,并且您只想检查文本是否为空,则init方法可能更合适。