使用Swiftify更好地发送消息
许多开发人员在初次尝试使用该语言时就对Objective-C的消息发送语义感到困惑。 消息发送的语义使得可以“调用”空对象上的方法。 您实际上并不是在调用方法,而不是将消息发送到没有地址的地方。
如果您是在Swift中构建应用,则不必担心理解Objective-C消息发送。 这就是为什么最新版本的Swiftify的Objective-C至Swift Converter大大改进了我们处理消息发送的方式。
在Objective-C中,属性只是方法周围的语法糖,可以像调用方法一样调用它。
@implementation TestViewController:UIViewController-(IBAction)graphButtonClicked:(id)sender
{
GraphViewController * graphViewController = [[[[self splitViewController] viewControllers] lastObject];
}@结束
注意对[self splitViewController]
而不是self.splitViewController
。 在Swift中,您不能引用self.splitViewController()
因为该方法不存在。 我们的转换器按预期处理此问题:
类TestViewController:UIViewController {
@IBAction func graphButtonClicked(_ sender:Any){
让graphViewController = splitViewController?.viewControllers.last as? GraphViewController
}
}
对[self splitViewController]
属性getter的调用将替换为Swift中适当的属性调用。 甚至splitViewController
的可选性都是正确的!
您可以在此处测试示例。
Objective-C如何处理方法和消息还有另一个有趣的方面。 Objective-C方法的参数名称不是方法签名的一部分。
@interface TestViewController:UIViewController
-(NSString *)greetPerson:(NSString *)personName;
@ end @ implementation TestViewController:UIViewController-(NSString *)greetPerson:(nonnull NSString *)name {
返回[NSString stringWithFormat:@“嗨,%@。”,名称];
}@结束
请注意,该方法的实现如何使用name
参数,但声明使用personName
。 这是完全有效的,因为参数的名称不是方法签名的一部分。
在转换后的代码中,正确使用name
代替personName
:
类TestViewController:UIViewController {
func greetPerson(_名称:字符串)->字符串? {
返回“嗨,\(名称)。”
}
}
在这里尝试。
额外的好处:预处理器指令的类型推断
与我们已经完成的消息发送工作无关,我们还添加了对预处理器指令的进一步支持。
#定义DEGREES_TO_RADIANS(度)(M_PI *(度)/ 180)
给定像上面这样的预处理器指令,Swiftify转换器现在可以找出方法的返回值的类型。
func DEGREES_TO_RADIANS(度:任何)-> Double {
返回.pi *(度)/ 180
}
在这里尝试。
看看这个很棒的博客文章:http://roadfiresoftware.com/2014/06/how-to-send-messages-aka-call-methods-in-objective-c/
您也可以仔细阅读《 Objective-C运行时编程指南》以深入了解该主题。
感谢您的阅读,如果您有任何反馈意见,请在下面发表评论!