Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此代码从objective-c更改为swift?_Objective C_Swift - Fatal编程技术网

如何将此代码从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

如何将此代码从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 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编码指南中的。但比方法的命名更重要的是,后续参数始终有一个名称。许多程序员甚至还没有看到您使用的无名参数约定。我建议给所有参数一个名称(第一个参数的名称被合并到方法名称中)可以提供更可读的代码。它消除了对后续参数的猜测。谢谢,也许我以后会试试你的建议。但我更喜欢亲吻原则(“保持简单,愚蠢”)