以适当的方式处理Objective-C中的“最终”参数

时间:2015-06-07 08:35:55

标签: java ios objective-c final

我需要将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
}

再次感谢

2 个答案:

答案 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;
}

说明:

  1. &获取变量的地址,结果的类型是&#34;指向常量OtherClassRef&#34;的指针。 - 你无法通过此指针分配,因为它指向一个常量。

  2. (OtherClassRef *)是类型&#34;指向OtherClassRef&#34;的转换,这是允许的,并且&#34; casts-away&#34; const。

  3. 在演员阵容前面的
  4. *,这是间接的,并且说使用指针来访问它指向写入(左手边)或阅读(右手边)的任何内容。

    < / LI>
  5. 双方都需要整个结构*(OtherCLassRef *)&,因为双方都是const并且要匹配,他们都需要非const

  6. 它是,谨慎使用

    注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中,至少据我所知,该字段在类中是可变的,这意味着如果开发人员不小心,可能会改变该值。