我有2个问题。首先,我无法从核心数据
将String数组转换为Int数组let sum = recordFilter.map{$0.amount!.dropFirst()} //["9.99", "6.58"]
let intSum = sum.map({Int($0)}) //[nil, nil]
我的数组格式:
[<Record: 0x600000099fa0> (entity: Record; id: 0xd0000000003c0000 <x-coredata://913F25A5-B2C9-4646-9091-5EFE7F906908/Record/p15> ; data: {
accountbook = "first book";
amount = "\U00a59.99";
assest = nil;
category = "\U6295\U8d44";
createdAt = "2017-11-16 16:00:00 +0000";
date = nil;
id = 15;
recordtype = "\U6536\U5165";
remark = "";
toAccBook = nil;
}), ...})]
其次,我希望按.reduce
加总,但我得到Cannot invoke 'reduce' with an argument list of type '(Int, _)'
如何解决?
let sum = recordFilter.map{$0.amount!.dropFirst()}.reduce(0, +)
let intSum = sum.map({Int($0)}).reduce(0, +)
//Cannot invoke 'reduce' with an argument list of type '(Int, _)'
答案 0 :(得分:1)
首先,我无法将Core数组从核心数据转换为Int数组
来自init?(_ description: String)
的说明以
description
传递的字符串可以以加号或减号字符(+或 - )开头,后跟一个或多个数字(0-9)
9.99
是Int
的无效格式,这可能是尝试进行转换的地图为每个元素返回nil的原因。
如果你这样做:
let doubleSum = sum.map({Double($0)})
你会接近你想要的,但阵列的元素将是选项。
其次,我想用.reduce求和它但是我得到了不能用'(Int,_)'
类型的参数列表调用'reduce'
问题是构造函数返回一个可选项。解决这个问题的一种方法是打开选项,但为了添加,nil
为零。
let doubleSum = sum.map{ Double($0) ?? 0.0 }.reduce(0, +)
你会得到你想要的。 ??
将字符串的结果展开为双转换,使用0转换失败。
或者更好,正如Martin R所建议的那样,你可以使用flatMap来消除??
的需要。
let doubleSum = sum.flatMap{ Double($0) }.reduce(0, +)
答案 1 :(得分:0)
您应该为变量注释显式类型,以检查您是否正在编码您认为自己的编码。我的猜测是你习惯了动态语言;它在这里不起作用。
recordFilter.map { ... }
创建了String
,因此reduce
分别需要一对T
和(T, String) -> T
类型的参数。使用T == Int
,它正在寻找不存在的+: (Int, String) -> Int
。
请注意,如果您解决了这个问题,sum
可能是String
或Int
(不确定您想要的是什么),那么应用map
执行您想要的任何内容都不是<TouchableOpacity
style={{ borderWidth:1,
borderColor:'rgba(0,0,0,0.2)',
alignItems:'center',
justifyContent:'center',
width:100,
height:100,
backgroundColor:'#fff',
borderRadius:100,
}}
>
<Icon name={"chevron-right"}
size={30}
color="#01a699" />
</TouchableOpacity>
我的估计是这样做的。