如何将此代码从objective-c更改为swift?
如何将此代码从objective-c更改为swift:如何将此代码从objective-c更改为swift?,objective-c,swift,Objective C,Swift,如何将此代码从objective-c更改为swift: - (void)get_answer_dict:(NSDictionary *)dict_1:(NSDictionary *)dict_2{ } 我写信给: func get_answer_dict(dict_1: [NSObject: AnyObject], dict_2: [NSObject: AnyObject]) { } 但不好 //出差错 2016-05-28 10:09:23.815 Meet Desig
- (void)get_answer_dict:(NSDictionary *)dict_1:(NSDictionary *)dict_2{
}
我写信给:
func get_answer_dict(dict_1: [NSObject: AnyObject], dict_2: [NSObject: AnyObject])
{
}
但不好
//出差错
2016-05-28 10:09:23.815 Meet Design[32299:919087] -[Meet_Design.DesignerScroll get_answer_dict::]: unrecognized selector sent to instance 0x7ffa8af32670
2016-05-28 10:09:23.825 Meet Design[32299:919087] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Meet_Design.DesignerScroll get_answer_dict::]: unrecognized selector sent to instance 0x7ffa8af32670'
*** First throw call stack:
(
0 CoreFoundation 0x000000010c67fd85 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010bd44deb objc_exception_throw + 48
2 CoreFoundation 0x000000010c688d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010c5cecfa ___forwarding___ + 970
您的Objective-C方法声明使用的是没有命名参数的方法签名样式,我们通常不再使用这种样式。你会选择那种风格,还是会选择更现代的风格?但是,如果您真的想实现一个没有命名参数的Swift方法,它应该是这样的:
func get_answer_dict(dict_1: [NSObject: AnyObject]!, _ dict_2: [NSObject: AnyObject]) {
...
}
您可以从Swift将其称为:
obj.get_answer_dict(dictionary1, dictionary2)
或从Objective-C:
[obj get_answer_dict:dictionary1 :dictionary2];
话虽如此,我还是衷心鼓励您使用更传统的方法命名约定,例如
- (void)retrieveAnswerWithDictionary1:(NSDictionary *)dictionary1 dictionary2:(NSDictionary *)dictionary2 {
....
}
你会称之为
[obj retrieveAnswerWithDictionary1:someDictionary dictionary2:someOtherDictionary];
Swift的等价物是:
func retrieveAnswerWithDictionary1(dictionary1: [NSObject: AnyObject], dictionary2: [NSObject: AnyObject]) {
...
}
这将被称为:
obj.retrieveAnswerWithDictionary1(someDictionary, dictionary2: someOtherDictionary)
注意,不仅参数被命名,而且我使用camelCase命名约定,不使用下划线
坦白地说,我会更具体地在字典中键入键和值类型,但我将把这留给你。Swift的一个关键好处是,它比Objective-C更重视类型安全性,因此我们通常不会使用
NSObject
或AnyObject
,除非我们必须这样做。只需将NSDictionary设置为数据类型。您尚未分享是否将方法的实现从Objective-C更改为Swift,或调用该方法,或两者兼而有之。也许您可以用如何调用此方法的示例更新此问题。坦率地说,我对您的错误消息感到有点惊讶,因为我本以为您会收到编译时警告。你没有收到吗?你的代码还可以,非常感谢。您的“传统方法命名约定”有哪些优点?命名约定的价值在于任何程序员都可以学习和遵循。如果你有其他开发人员在编程,你知道每个人都在同一页上。有关命名约定的详细信息,请参阅Cocoa编码指南中的。但比方法的命名更重要的是,后续参数始终有一个名称。许多程序员甚至还没有看到您使用的无名参数约定。我建议给所有参数一个名称(第一个参数的名称被合并到方法名称中)可以提供更可读的代码。它消除了对后续参数的猜测。谢谢,也许我以后会试试你的建议。但我更喜欢亲吻原则(“保持简单,愚蠢”)