无法将Core数组从核心数据转换为Int数组,并在Swift 4中求和

时间:2017-11-17 09:23:03

标签: swift

我有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, _)'

2 个答案:

答案 0 :(得分:1)

  

首先,我无法将Core数组从核心数据转换为Int数组

来自init?(_ description: String)

的说明
  

description传递的字符串可以以加号或减号字符(+或 - )开头,后跟一个或多个数字(0-9)

9.99Int的无效格式,这可能是尝试进行转换的地图为每个元素返回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可能是StringInt(不确定您想要的是什么),那么应用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> 我的估计是这样做的。