Textfield NSNumber转换崩溃



我翻了一遍老问题,但找不到解决办法:

我有这个简单的视图:

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

或更短,当然

最新更新