我翻了一遍老问题,但找不到解决办法:
我有这个简单的视图:
struct ContentView: View {
@State var myInt: Int = 0
var body: some View {
TextField("Int", value: $myInt, formatter: NumberFormatter())
}
}
在运行时,在TextField中输入' 111111111111111111111 '或任何20位或更多的数字会崩溃:
"致命错误:无法桥接NSNumber到Int: file">
如果我把类型改成:
@State var myInt: NSNumber = 0
输入的值被转换为'111111111111111110000'并且不会崩溃。
我的问题是,我希望myInt是Int类型,而不是NSNumber,同时保持安全,避免崩溃。
我尝试了几次将String转换为NSNumber再转换为Int,但没有成功。
尝试1:使用绑定,在setter中验证
var body: some View {
TextField("Int", value: Binding(
get: { myInt },
set: {
var fixedInt: Int
if $0 > 9223372036854775807 { fixedInt = 0 } else { fixedInt = $0 }
myInt = fixedInt }
), formatter: NumberFormatter())
}
}
不幸的是,问题仍然存在。
感谢这些评论,它们让我更好地关注我的问题,我找到了一个解决方案。
首先,我终于理解了如何访问NumberFormatter属性。我不太清楚。我可以在init()中设置它们:
struct ContentView: View {
@State var myInt: Int = 0
let formatter = NumberFormatter()
init() {
formatter.maximum = 9223372036854775807
}
var body: some View {
TextField("Int", value: $myInt, formatter: formatter)
}
}
令我惊讶的是,给出9223372036854775808和9223372036854775809的值仍然有可能崩溃。这在理论上并不完全令人满意,但实际上,我的应用程序将使用更低的值,所以我可以设置:
formatter.maximum = 922337203685477580
或更短,当然