【问题标题】:Class method access by dot operator [duplicate]通过点运算符访问类方法[重复]
【发布时间】:2014-01-24 08:52:32
【问题描述】:

这个问题与知道我们不知道的事情有关。我正在研究“为什么人们不使用它”?这背后的任何原因是否与特定技术有关?所以请仔细阅读并投反对票或给出正确答案。

我们可以写

NSMutableString *string = NSMutableString.string;

而不是

NSMutableString *string = [NSMutableString string];

同理,这个方法怎么写,

NSMutableString *string = [NSMutableString stringWithString:@"test"];

更新:

这个问题不是重复的,有点不同。我接受以下不推荐给优秀程序员的答案。但是他们没有解释Why,对于What reason, programmers should avoid this? 任何人都可以通过适当的链接或文档对此做出明确的解释吗?

【问题讨论】:

  • NSMutableString.string; 不应使用。 . 语法只能用于属性而不是普通方法。由于您分类的 Objective-C 消息的方式,它也适用于没有任何参数的方法。但这不应该以这种方式使用。
  • @rckoenes 我的朋友,你在哪里看到“我们不应该将这个点用于类方法”?请出示一些参考资料。
  • 这是一个方法而不是一个属性,. 语法用于属性。来自 Apple 文档:Objective-C offers an alternative dot syntax to access an object’s properties.
  • @rckoenes 我知道,属性应该通过.gettersetter 方法访问。我的问题是关于class method?你在哪里看到class method should not use .` 运算符?
  • @Mani 无处,但也无处指定您应该这样做。混合属性表示法和方法表示法时,您的代码将变得不可读。

标签: ios class-method nsmutablestring


【解决方案1】:

NSMutableString.string 是一个黑客。它“工作”的原因与 myString.length[myString length] 产生相同结果的原因相同。但是,由于点符号不与实际属性一起使用,这是对语言特性的滥用,因为属性具有不同的语义。例如,当您多次访问一个属性时,您自然希望得到相同的结果,除非对象的状态在两次调用之间发生了变化。由于NSMutableString.string 在每次调用时都会生成一个新的字符串对象,它破坏了“正确”属性的语义预期,降低了程序的可读性。

Objective-C 没有使用点符号调用带有参数的方法的通用方法。特性非常特定于属性。虽然理论上你可以使用MyClass.xyz = abc 代替[MyClass setXyz:abc],但这也是一个hack。

为了回答您的问题,Objective-C 不提供使用点符号调用 [NSMutableString stringWithString:@"test"] 的方法。

【讨论】:

  • 我可以部分接受你。这个说法dot notation is not used with an actual property 不应该是正确的,我想?你怎么说?你能显示一些链接或规格吗?
  • 查看我更新的问题..
  • @Mani 我用一个简短的例子扩展了答案,说明通过属性语法调用 NSMutableString.string 有什么问题。
  • @Mani 这里有两种不同的语义可供查看——一种用于编译器,另一种用于代码的读者。编译器将[NSMutableString string]NSMutableString.string 视为表达同一件事的不同方式;它将生成相同的确切代码。但是,程序的读者希望第二个表达式代表与状态相关的东西。他们需要几秒钟的时间来“破译”你的程序的含义,这是非常糟糕的。
  • @Mani 可以调用类方法的事实本身就是一个不幸的技术巧合:出于某种原因,编译器设计者没有添加代码来禁止这种调用,所以当x.y 代码是翻译成[x y],它也适用于类方法。
【解决方案2】:

它只是一个语法糖。 string 方法没有参数,因此它被视为一个 getter,实际上并非如此。 stringWithString:是带参数的方法,不能这样调用。

一般来说,我不建议在方法中使用点语法,这会造成混淆。 Objective-C dot notation with class methods?

更新

我认为您没有任何技术上的理由应该避免它。 而是在编码风格方面,保持代码干净和一致。

【讨论】:

  • 我接受一件事,不建议所有程序员这样做。我的问题是“为什么”?为了什么”?。您的意思是“没有参数的类方法,被视为getter方法”吗?这是正确的吗?
  • 查看我更新的问题......
  • 我的朋友,我知道这不是正确的编码风格。我正在研究“为什么人们不使用它”?任何原因与特定技术有关吗?我需要知道这一点。
猜你喜欢
  • 2017-06-02
  • 2013-06-10
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2014-02-13
  • 2018-10-19
相关资源
最近更新 更多