iOS swift为什么两种类型的闭包无法添加到数组中

时间:2016-08-28 09:03:49

标签: ios swift closures

let sum1 = {(a:Int, b:Int) -> Int in return a + b}
let sum2 = {(a:Float, b:Float) -> Float in return a + b}

var cl = [sum1, sum2]

为什么sum1sum2无法添加到数组中? 我知道sum1需要两个Ints返回一个Int,sum2需要两个Floats返回一个Float,但是一个数组可以添加两个不同类型的对象,例如let foo = [12, "12"]是有效的。

2 个答案:

答案 0 :(得分:1)

您使用main()的建议将进行编译,但如果您在属性中需要class Book{ private: int bookid; string bookname; // char bookname[50]; because it can accept book name length more than 50 character. string authorname; // char authorname[50]; because it can accept authorname length more than 50 character. float cost; public: void getinfo(void){ for(int i =0; i < 5; i++){ cout << "Enter Book ID" <<endl; cin >> bookid; cout << "Enter Book Name" << endl; getline(cin,bookname); // Because book name can have spaces. cout << "Enter Author Name" << endl; getline(cin,authorname); // Because author name can have spaces too. cout << "Enter Cost" << endl; cin >> cost; } } void displayinfo(void); }; (或[Any]),则几乎总是存在设计错误。 Any存在于极少数情况下,你真的必须绕过类型系统,但你通常会遇到很多麻烦。

根据您的基本目标,这些问题有许多类型安全的解决方案。如果您的目标是将Int-methods与Float方法分开,最可能的解决方案是使用枚举:

AnyObject

Any意味着你可以扔掉任何东西,这是你的问题,弄清楚如何处理你在其中发现的随机事物。编译器无法帮助你,在某些情况下会积极打击你。您需要接受未定义的行为或在整个地方添加enum Operator { case int((Int, Int) -> Int) case float((Float, Float) -> Float) } let sum1 = Operator.int {(a, b) in return a + b } let sum2 = Operator.float {(a, b) in return a + b} let cl = [sumop1, sumop2] 以在运行时检查您是否犯了错误。

Any是“OR”类型。 precondition是一组函数,可以在Ints或Floats上运行。这似乎是你的意思,所以让编译器通过告诉它你的意思来帮助你。编译器将在编译时检测错误,而不是在运行时崩溃。许多单元测试变得不必要,因为整个类的错误是不可能的。使用正确的类型和编译器的帮助,您可以将Operator简化为:

[Operator]

这是非常好的IMO。

另一方面,如果目标是同时接受Ints和Floats,那么你应该将它们包装在NSNumber中,这可以同时适用于两者。如果你想跟踪哪些是Ints,哪些是Floats,那么你可以更仔细地应用你的数学,你可以创建一个结构:

cl

答案 1 :(得分:0)

原因是每个闭包代表新类型,如果您的数组不是AnyAnyObject类型,那么它只能包含一种类型的元素。这就是为什么你不能轻易将它们放在里面的原因。对于Closures,您需要使用类型Any,因为闭包是结构类型。