这两种方法适用于在类中打开文件并处理可能的错误,实现的对象需要在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的新见,我看不到的替代方法也将受到高度赞赏。
答案 0 :(得分:1)
您可以使用这两种形式。这取决于更好的背景。
例如,如果您在一个抛出错误的函数中使用该调用,则抛出方法更方便。如果错误描述不重要,并且您只想检查文本是否为空,则init方法可能更合适。