我需要将Java
类“翻译”为Objective-C
,并且此类具有private final
成员和接收final
参数的初始化方法:
public class MyClass implements ParentClass {
private final OtherClass mOther;
public MyClass(final OtherClass other) {
this.mOther = other;
}
}
在Objective-C
中编写等效代码的最佳方法是什么?
提前致谢
编辑:我需要处理的另一个final
参数场景:一个不是初始化程序的方法,并且没有将params分配给类的成员,它们仅用于方法:
public List<ClassB> calculateSomething (final ClassA objectA) {
// Some code and return sentence
}
再次感谢
答案 0 :(得分:2)
Objective-C具有等效的final
实例变量,其中称为const
,除了,这样的变量无法在init
中初始化方法
在继续之前,你应该问自己是否应该真的这样做。您是否真的要尝试在Objective-C中编写Java,而不是编写在Objective-C中完成相同任务的代码?曾经注意到,一个说你的母语的外国人听起来很奇怪,因为他们说的是自己的语言,但是使用你的语言?编程语言也是如此 - 用Java编写Java,用Objective-C编写Objective-C等
尽管如此,有时候一种语言并不能支持你喜欢的东西,或者它可能会支持......
警告:以下内容会严重损害您的健康!
在C中,诸如类型和常量之类的东西仅仅是可以随意绕过的小事 - 这种缺乏理性的态度被真正的信徒视为一个伟大的特征,C程序员知道他们在做什么; - )
在你的情况下你正在寻找的是能够去除const&#34;的C能力,即分配给常数。 (公平地说FORTRAN最初提出了想法,虽然不是故意的)。
首先,为了让事情变得更容易typedef
:
typedef OtherClass *OtherClassRef;
这使得编写const
声明更容易。现在直接等同于您的Java代码:
@implementation MyClass
{
const OtherClassRef mOther;
}
- (instancetype) init:(const OtherClassRef)other
{
self = [super init];
if (self)
{
// mOther = other; // Compile-time error: Read-only variable is not assignable
// BUT in (Objective-)C(++) you can "cast-away const"
*(OtherClassRef *)&mOther = *(OtherClassRef *)&other; // Yes it is ugly, which means nobody will do it by mistake!
}
return self;
}
说明:
&
获取变量的地址,结果的类型是&#34;指向常量OtherClassRef
&#34;的指针。 - 你无法通过此指针分配,因为它指向一个常量。
(OtherClassRef *)
是类型&#34;指向OtherClassRef
&#34;的转换,这是允许的,并且&#34; casts-away&#34; const。
*
,这是间接的,并且说使用指针来访问它指向写入(左手边)或阅读(右手边)的任何内容。
双方都需要整个结构*(OtherCLassRef *)&
,因为双方都是const
并且要匹配,他们都需要非const
。
它是,谨慎使用。
注1:如果您尝试使用其他变量类型(例如局部变量),它可能(看起来)不起作用。
注2:某些编译器可能会反对取&
的地址(const
) - Xcode / Clang不会。
注3:删除typedef
并完全写下你的声明 - C声明语法是测验问题的内容!
答案 1 :(得分:0)
我的Objective-C有点生疏,但它是这样的:
<强> MyClass.h 强>
@interface MyClass : NSObject
@property (nonatomic, readonly, strong) MyClass* mOther;
-(instancetype) initWithMyClass:(MyClass *) other;
@end
<强> MyClass.m 强>
@interface MyClass
@property (nonatomic,readwrite, strong) MyClass* mOther;
@end
@implementation MyClass
-(instancetype) initWithMyClass:(MyClass *) other{
self = [super init];
if(self){
self.mOther = other;
}
return self;
}
@end
虽然我应该说在Objective-C中确实没有与final的完全等价。在Java中,final字段只能在构造函数中设置,并且在类中是不可变的。在Obejctive-C中,至少据我所知,该字段在类中是可变的,这意味着如果开发人员不小心,可能会改变该值。