使用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运行时编程指南》以深入了解该主题。

感谢您的阅读,如果您有任何反馈意见,请在下面发表评论!