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]
为什么sum1
和sum2
无法添加到数组中?
我知道sum1
需要两个Ints返回一个Int,sum2
需要两个Floats返回一个Float,但是一个数组可以添加两个不同类型的对象,例如let foo = [12, "12"]
是有效的。
答案 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)
原因是每个闭包代表新类型,如果您的数组不是Any
或AnyObject
类型,那么它只能包含一种类型的元素。这就是为什么你不能轻易将它们放在里面的原因。对于Closures,您需要使用类型Any
,因为闭包是结构类型。