我希望Swift的init()类在将文件加载到类中的字符串时出错时抛出错误。加载文件后,字符串将不会更改,因此我更喜欢使用let。这有效:
class FileClass {
var text: NSString = ""
init() throws {
do {
text = try NSString( contentsOfFile: "/Users/me/file.txt", encoding: NSUTF8StringEncoding ) }
catch let error as NSError {
text = ""
throw error
}
}
}
但是当我更换
var text: NSString = ""
和
let text: NSString
我得到一个类实例的所有存储属性,必须先进行初始化,然后再引发初始化错误。
我尝试了各种方法,例如使文本可选
let text: NSString?
但尚未找到任何可行的方法。是否有可能从文件中加载文本,使其不可变,并且init()会引发错误?我可以给我蛋糕吃三个吗?
提前谢谢了!
从Swift 2.2开始,您可以中断类初始化程序的执行,而无需填充所有存储的属性
class FileStruct {
let text: String
init() throws {
do {
text = try String(contentsOfFile: "/Users/me/file.txt", encoding: NSUTF8StringEncoding ) }
catch let error as NSError {
throw error
}
}
}
当前,在Swift中,class
您无法在初始化每个存储的属性之前中断初始化程序的执行。
在另一方面,你没有这个约束与structs
如此
struct FileStruct {
var text: String
init() throws {
do {
text = try String(contentsOfFile: "/Users/me/file.txt", encoding: NSUTF8StringEncoding ) }
catch let error as NSError {
throw error
}
}
}
您也可以避免执行do / catch块
struct FileStruct {
var text: String
init() throws {
text = try String(contentsOfFile: "/Users/me/file.txt", encoding: NSUTF8StringEncoding)
}
}
最后我替换为NSString
,String
因为我们使用的是Swift,而不是Objective-C ;-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句