Objective-C/C++是否等同于C#的成员大括号初始化功能?

Mar*_*eIV 5 c# objective-c member-initialization

除了'var'(参见我在这里的另一篇文章)之外,我真正喜欢C#的一个原因是我可以声明,然后使用大括号初始化类的成员,就像这样......

var reallyLongFooVarName = new ReallyLongFooClassName(){
    Name = "I'm an instance of Foo",
    ID   = 23 };
Run Code Online (Sandbox Code Playgroud)

甚至在一条线上,像这样......

var longFooVarName = new ReallyLongFooClassName(){ Name = "I'm an instance of Foo", ID = 23 };
Run Code Online (Sandbox Code Playgroud)

这将创建一个ReallyLongFooClassName实例,然后设置其成员'Name'和'ID'.

这个编译成同样的东西,就像你输入这个......

ReallyLongFooClassName reallyLongFooVarName = new ReallyLongFooClassName();
reallyLongFooVarName.Name = "I'm an instance of Foo";
reallyLongFooVarName.ID = 23;
Run Code Online (Sandbox Code Playgroud)

那么Objective-C/C++有什么东西等同于C#的成员括号初始化吗?

注意:感谢我的另一篇文章,我已经知道'auto'是Objective-C++中的'var'等价物,但Objective-C没有任何这样的等价,这是一种耻辱.再次,请在此处查看我的其他帖子以获取更多信息.)

更新

我知道写初始化器.这完全是一个不同的节拍.我在上面演示的技术在C#中使用属性的setter,或者直接设置成员变量而不必编写构造函数(它们等同于Objective-C的'init'成员.)必须编写init成员强制你必须预先指定您要设置的内容.成员大括号初始化允许您以任何您想要的顺序指定属性/成员变量的任意组合.同样,它只是一次编写多行代码的语法糖.它实际上并没有改变课程.

San*_*eep 1

如果您考虑使用 Objective C/C++,有多种选择。

目标C:

在A类中创建初始化方法:

@interface ClassA:NSObject
-(id)initWithName:(NSString*)name id:(NSUinteger)id;
@end

@implementation ClassA{
  NSString *name;
  NSUinterger id;
}

-(id)initWithName:(NSString*)name id:(NSUInteger)id{
  self = [super init];
  if(!self)
    return nil;
  self -> name = name;
  self -> id = id;
  return self;
}
Run Code Online (Sandbox Code Playgroud)

正在初始化;

[[ClassA alloc] initWithName:@"MyName" id:1000];
Objective C alternative,
Run Code Online (Sandbox Code Playgroud)

使用类或结构;

使用结构体;

struct MyClass{
    NSString *name;
    NSString *identifier;
    MyClass(NSString *name, NSUInteger identifier):name(name), identifier(identifier);

};
Run Code Online (Sandbox Code Playgroud)

正在初始化;

MyClass *myclass = new MyClass(@"Sandeep", 1000);
Run Code Online (Sandbox Code Playgroud)

使用类;

class MyClass{
private:
    NSString *name;
    NSString *identifier;
public:
    MyClass(NSString *name = @"", NSUInteger identifier = 0);

};
Run Code Online (Sandbox Code Playgroud)

我认为这应该可以回答你的问题。

  • 是的,我知道初始化器。但这不是我所追求的。使用成员初始化,您可以以任何顺序指定要设置的成员的任意组合。使用“init”方法会强制您 a) 编写 init 调用,b) 显式指定要包含的成员。完全不同的事情。 (3认同)