您的getData()函数返回一个字符串值而不是可选值。因此,您应该使用?运算符将getData函数的返回类型更改为可选值类型,以便涵盖可能出现的情况。
如果您的getData函数始终返回字符串值,则while let始终期望一个可选值。在这种情况下,使用while let没有意义,因为您会有意地告诉编译器getData函数始终返回一个字符串值并尝试展开它,而我们不应该展开非可选值。
错误处理的代码(考虑到Swifter):
private func nextLine() throws -> String?{
var returnData : String? = ""
if arc4random_uniform(7) != 3 {
returnData = "Genreated Random number other than 3"
}else{
throw NSError(domain: "Generated random number 3", code: 111, userInfo: nil)
}
return returnData
}
do {
while let headerLine = try nextLine() {
print(headerLine)
}
}catch{
print(error)
}
nextLine函数返回一个字符串,告诉我们“生成的随机数不等于3”,如果生成的数字等于3,则它将会抛出一个异常,并且可以在catch块中处理。在这里我有可能会让nextLine函数返回一个可选值。如果我从nextLine函数的返回类型中删除问号,将导致一个错误,指出“条件值的初始化程序必须具有可选类型而不是字符串”,这意味着编译器尝试解包一个非可选值,这是毫无意义的。
考虑:
var someIntegerValue = 5
if let x = someIntegerValue
{
// it will give an error
}
以上代码会报错,错误提示为“条件绑定的初始化器必须具有可选类型,而非Int”,因为我们在此尝试解包一个非可选值。
If you replace var some = 5 with var some : Int? = 5 it will be all right.
错误/异常处理:
在获取值之前,您可以使用try关键字,该关键字应写在do块中,它将获取值或引发异常。异常应在catch块中处理。
while let data try Provider.getData() as String? {…}
。是否有不需要进行不必要转换的解决方案? - flashspys