Ios 正在将字符串分配给双。。。。线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0)
我有一个选择器视图(我称之为微调器),其中有两个组件恰好等于英镑和便士的值。。。每个的数据源为0到99,因此用户可以选择从0.00英镑到99.99英镑的任何值 我有下面一段带有prepareForSegue函数的代码Ios 正在将字符串分配给双。。。。线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0),ios,swift,Ios,Swift,我有一个选择器视图(我称之为微调器),其中有两个组件恰好等于英镑和便士的值。。。每个的数据源为0到99,因此用户可以选择从0.00英镑到99.99英镑的任何值 我有下面一段带有prepareForSegue函数的代码 //need to find out what the spinner is set to var firstComponent = pickerData[0][spinFuelAmount.selectedRowInComponent(0)] firstComponent = f
//need to find out what the spinner is set to
var firstComponent = pickerData[0][spinFuelAmount.selectedRowInComponent(0)]
firstComponent = firstComponent.stringByReplacingOccurrencesOfString( "£ ", withString: "" )
var secondComponent = pickerData[1][spinFuelAmount.selectedRowInComponent(1)]
secondComponent = secondComponent.stringByReplacingOccurrencesOfString( " .", withString: "" )
let amountAsString = firstComponent + "." + secondComponent
Data.sharedData.fuelAmount = Double(amountAsString)!
Data.sharedData.fuleAmount在我的singleton类中声明为双精度
import Foundation
class Data: NSObject {
static let sharedData = Data()
var startMileage: String!
var previousMileage: String!
var startLocation:String!
var endLocation:String!
var didFillUp: Bool!
var previousFuelMileage: String!
var fuelFillMileage: String!
var fuelAmount: Double!
var sender: String!
}
运行时,程序在这些行的最后一行中断,错误为线程1:EXC\U BAD\U INSTRUVTION(代码=EXC\U I386\U INVOP,子代码=0x0)
由于我是Xcode和Swift新手,我正在努力调试并找到原因。。。感谢您的帮助。如果您打印出
amountAsString
它会显示什么?另一方面,您应该尽可能避免隐式展开,以防止出现此类错误。最后,我不建议对货币使用Double
。最好使用NSDecimalNumber
或将小数保留为Int
。这将在以后为您节省许多问题/头痛。@Eendje amountAsString值看起来都很好。。。我得到的样本值是“32.45”、“11.04”、“5.00”、“64.02”、“9.55”等。。。我会看看更改为NSDecimalNumber是否有帮助…更改为NSDecimalNumber没有帮助。我通过使用@Eendje第二个建议解决了这个问题,并将燃油量保持为整数。。。实际上,我将金额存储为两个Int(s),一个表示英镑值,另一个表示便士值。改为NSDecimalNumber并没有帮助。只是当你处理货币时,你不应该使用浮动或双精度。因为,如果您尝试打印((9.49*0.1)=0.949)它会打印:false
@Eendje-理解。。。现在所有完成的工作都使用int值。。。我的应用程序很简单。。。不涉及数学,它只存储里程和燃油,然后输出,以便在公司里程日志中提交