Swift 如何从条件绑定必须具有可选类型的 do catch 返回元组?
Swift How to returning a tuple from a do catch where conditional binding must have optional type?
我想把一个 swift 3 do-catch
放在一个函数中,而不是不断地在我需要的地方写它;在这个函数中,我希望 return 一个带有布尔值和可选错误的 tuple
。
我正在尝试从函数中 return 一个元组并在我的 XCTest
中处理结果
但是,我收到一条错误消息:
Initializer for conditional binding must have Optional type, not '(Bool, Error?)' (aka '(Bool, Optional)')
我的函数如下;
public static func isValidPurchase(train: Train, player: Player) -> (Bool, Error?) {
do {
let result = try train.canBePurchased(by: player)
return (result, nil)
} catch let error {
return (false, error)
}
}
我的canBePurchased
代码有点长,但是是这样的:
func canBePurchased(by player: Player) throws -> Bool {
if (!self.isUnlocked) {
throw ErrorCode.trainIsNotUnlocked(train: self)
}
// other if-statements and throws go here
}
在我的 XCTest 中,我这样称呼它:
if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as! (Bool, Error?) {
}
我试过强制转换:
if let result: (Bool, Error?) ...
但这只会将编译器错误降级为警告。
编译器显示上述错误。
我在 Initializer for conditional binding must have Optional type
方面做错了什么,我该如何避免?
谢谢
只需使用可选转换而不是强制转换。即使在没有 if let 语句的情况下使用强制转换结果也将具有非可选值。
if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as? (Bool, Error?) {
}
来自 isValidPurchase(train:player)
的 return 类型是 (Bool, Error?)
,它不是可选的(它是一个元组,其中第二个成员恰好是可选的)。因此,在从对 isValidPurchase(train:player)
的调用中捕获 return 时,可选绑定没有用处。您只需分配 return 值并从那里研究它的内容(可能的错误等):
// e.g. using explicitly separate tuple members
let (result, error) = TrainAPI
.isValidPurchase(train: firstTrain, player: firstPlayer)
if let error = error { /* you have an error */ }
else { /* no error, proceed with 'result' */ }
或者,使用 switch
语句研究 return:
// result is a tuple of type (Bool, Error?)
let result = TrainAPI
.isValidPurchase(train: firstTrain, player: firstPlayer)
switch result {
case (_, let error?): print("An error occured!")
case (let result, _): print("Result = \(result)")
}
我想把一个 swift 3 do-catch
放在一个函数中,而不是不断地在我需要的地方写它;在这个函数中,我希望 return 一个带有布尔值和可选错误的 tuple
。
我正在尝试从函数中 return 一个元组并在我的 XCTest
中处理结果但是,我收到一条错误消息:
Initializer for conditional binding must have Optional type, not '(Bool, Error?)' (aka '(Bool, Optional)')
我的函数如下;
public static func isValidPurchase(train: Train, player: Player) -> (Bool, Error?) {
do {
let result = try train.canBePurchased(by: player)
return (result, nil)
} catch let error {
return (false, error)
}
}
我的canBePurchased
代码有点长,但是是这样的:
func canBePurchased(by player: Player) throws -> Bool {
if (!self.isUnlocked) {
throw ErrorCode.trainIsNotUnlocked(train: self)
}
// other if-statements and throws go here
}
在我的 XCTest 中,我这样称呼它:
if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as! (Bool, Error?) {
}
我试过强制转换:
if let result: (Bool, Error?) ...
但这只会将编译器错误降级为警告。
编译器显示上述错误。
我在 Initializer for conditional binding must have Optional type
方面做错了什么,我该如何避免?
谢谢
只需使用可选转换而不是强制转换。即使在没有 if let 语句的情况下使用强制转换结果也将具有非可选值。
if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as? (Bool, Error?) {
}
来自 isValidPurchase(train:player)
的 return 类型是 (Bool, Error?)
,它不是可选的(它是一个元组,其中第二个成员恰好是可选的)。因此,在从对 isValidPurchase(train:player)
的调用中捕获 return 时,可选绑定没有用处。您只需分配 return 值并从那里研究它的内容(可能的错误等):
// e.g. using explicitly separate tuple members
let (result, error) = TrainAPI
.isValidPurchase(train: firstTrain, player: firstPlayer)
if let error = error { /* you have an error */ }
else { /* no error, proceed with 'result' */ }
或者,使用 switch
语句研究 return:
// result is a tuple of type (Bool, Error?)
let result = TrainAPI
.isValidPurchase(train: firstTrain, player: firstPlayer)
switch result {
case (_, let error?): print("An error occured!")
case (let result, _): print("Result = \(result)")
}