我有以下头文件和实现文件,其中NSURLMyObject
是的类别NSURL
,并且包含一个只读类属性myString
:
NSURL+MyClass.h
@interface NSURL (NSURLMyClass)
@property(class, readonly) NSString* myString;
@end
NSURL+MyClass.mm
@implementation MyObject
static NSString* _myString;
+ (NSString*) myString
{
if (_myString == nil) {
_myString = @"Hello";
}
return _myString;
}
@end
我还看到过其他帖子,其中有以下情况:
readwrite
在实现中重新声明属性,然后进行合成- 或者直接访问带下划线的成员变量,但没有讨论类属性,也没有讨论类别的类属性。
我相信此类类只读属性大致相当于static constexpr
现代 C++ 中的成员变量,其中初始化它们只需在标题中使用一行代码:
我的类.hxx
#include <string>
using std::literals;
struct MyClass
{
static constexpr auto myString = "Hello"s;
};
// access with, for example, `std::println("{}", MyClass::myString);`
现在回答我的问题:
是否可以
MyClass.myString
更紧凑地初始化,类似于 C++,而无需声明static
下划线前缀的变量、getter 和空值测试?我应该声明一个
+ (instancetype) init
方法然后myString
在其中初始化吗?这不会覆盖已经提供的+init
方法吗?NSURL
还有其他方法吗,即子类而不是类别?我对 Objective-C 语义不太熟悉,因此我不确定
NSURL*
某个 Foundation 类返回的 是否可以直接转换为MyClass*
where@interface MyClass : NSURL
。