如何在Xcode max中编写类似于Java或C ++语法的代码,特别是调用函数(消息),静态还是动态?我只想简单地用类C语法调用Objective-C函数。
如何写NSString * s = NSString.alloc().init();
(或类似的,例如,NSString::alloc().init()
,或NSString::alloc.init
或(new NSString()).alloc().init() ;))
在Xcode(或其他iPhone开发环境)中,编译器没有导致错误,它将运行。
或类似
的代码NSString * a = NSString.alloc().init(); //or similar
bool b = a.compare("abcdef"); //or bool b = a->compare("abcdef");
将会运行。
答案 0 :(得分:4)
Objective-C有C函数。实际上,所有有效的C代码都是有效的Objective-C代码。所以是的,你可以使用C语法调用函数。
但是,对象和消息发送使用Objective-C对C的语法扩展,这是不可配置的。他们是语言的一部分。您不能更改Objective-C的语法,而不能使C ++使用Smalltalk语法。
答案 1 :(得分:0)
不,没有办法用不同的语法调用Objective-C方法,但有一个例外:
您可以调用不带点参数的参数的方法,如object.method
中所示(这主要用于属性,而属性又是编译器生成的getter和setter方法)。
因此无法更改Objective-C([object method]
或[object methodWithArgumentA:someValue argumentB:otherValue]
)中调用方法的方式。这是语言设计者选择的语法。一旦你使用了一点,你就会明白为什么:
Objective-C中的方法名称往往是非常具有描述性的,并且被用作Objective-C具有命名参数(从技术上讲,情况并非如此)。像:
[someData writeToFile:aFileName atomically:YES];
您如何将其转换为点符号?它可能看起来像这样:
someData.writeToFileAtomically(aFileName, YES);
现在,如果我看到一个方法只是writeToFileAtomically
我会不会感到惊讶,如果它只需要一个参数(是否原子写入文件;但是哪个文件?)或没有参数(只是写入一个原子地文件;再次,哪个文件?)。使用Objective-C表示法,意图更清晰。
现在考虑object.addObserverForKeyPathOptionsContext(o, k, op, c)
与[object addObserver:o forKeypath:k options:op context:c]
。
是否喜欢这种语法是主观的。你似乎不喜欢它,因为你不会问如何摆脱它。但是如果你想编写Objective-C代码,你必须接受这就是它的完成方式而你无法改变它。拥抱它,我一开始也发现它很奇怪(也来自长篇C ++和Java背景)但是现在我想念在使用其他语言时用Objective-C的参数调用方法的非常冗长的方式。