gpt4 book ai didi

objective-c - 如果使用 self,则使用 instanceType 作为返回值会失败。为什么?

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:34 25 4
gpt4 key购买 nike

static NSMutableDictionary * allTheSingletons;
@implementation BGSuperSingleton

+(instancetype)singleton
{
return [self singleton1];
}
+(id) singleton1
{
NSString* className = NSStringFromClass([self class]);

if (!allTheSingletons)
{
allTheSingletons = NSMutableDictionary.dictionary;
}

id result = allTheSingletons[className];

PO(result);
if (result==nil)
{
result = [[[self class] alloc]init];
allTheSingletons[className]=result;
}
return result;
}

BGSuperSingleton 应该是所有单例类的父类。

然后我在其中一个子类中做:

+(NSPredicate *)withinASquare:(double)distance{
CLLocation * anchorWeUsed=[self singleton].mapCenterLocation; //Error map center is not of type ID
return [self withinASquare:distance fromLocation:anchorWeUsed];
}

看起来 CLANG 不理解单例是 +(instancetype) 类型,而是认为类型是 id。

我错过了什么?

self 替换为 MySubSingletonClass(这是编译时已知的东西)是可行的。

有什么解释吗?

最佳答案

不确定(以下所有内容都只是我的假设)但似乎在编译时编译器不知道 [self singleton1] 的类。正如docs中所说(如果我们在 instancetype 上也推断该行为):

... and the method will have a related result type if its return type is compatible with the type of its class...

singleton1 返回未知类的对象,singleton 还认为它返回与 BGSuperSingleton 类不兼容的对象(就编译时未知而言)时间),因此相关的结果魔术在这里不起作用。

对此很感兴趣,也检查过:

+ (NSPredicate*) withinASquare: (double)distance {
CLLocation* anchorWeUsed = [[self alloc] init].mapCenterLocation; // Error map center is not of type ID
return [self withinASquare:distance fromLocation:anchorWeUsed];
}

allocinit 返回相关的结果类,错误仍然存​​在。有帮助的是:

+ (NSPredicate*) withinASquare: (double)distance {
BGSuperSingleton* bgSuperSingleton = [[self alloc] init]; // class is known at compile time
CLLocation* anchorWeUsed = bgSuperSingleton.mapCenterLocation; // no error here
return [self withinASquare:distance fromLocation:anchorWeUsed];
}

我仍然对此很感兴趣,希望有人能批准或纠正我的假设

关于objective-c - 如果使用 self,则使用 instanceType 作为返回值会失败。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com