Objective-C - 接收器类型“NSInteger”(又名“long”)不是 Objective-C 类,并且接收器类型“NSDecimal”不是 Objective-C 类

Mag*_*oss 5 objective-c ios

我收到标题错误,但我不知道为什么......

。H

@interface ItemData : NSObject

@property (nonatomic,assign) NSInteger tagId;
@property (nonatomic,strong) NSMutableString *deviceId;
@property (nonatomic,strong) NSDecimal *latitude;
@property (nonatomic,strong) NSDecimal *longitude;


@end
Run Code Online (Sandbox Code Playgroud)

.米

#import <Foundation/Foundation.h>
#import "ItemData.h"

@implementation ItemData

-(id)init
{
    if(self = [super init])
    {
        //TODO: Fix Commented out items

        _tagId = [[NSInteger alloc] init];
        _deviceId = [[NSMutableString alloc] init];
        _latitude = [[NSDecimal alloc] init];
        _longitude = [[NSDecimal alloc] init];

    }
    return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

我不明白我做错了什么......有人可以帮助我吗?

Ami*_*wad 2

NSIntegerNSDecimal不是类,而是标量的类型。您不能向这种类型的“对象”(在 C 意义上,而不是在 OOP 意义上)发送消息。因此,您不要使用+alloc和来构造它们-init\xe2\x80\xa6

\n\n

你有两种可能性:

\n\n

A. 使用 (OOP) 对象代替标量

\n\n
@property (nonatomic,assign) NSNumber *tagId;\n@property (nonatomic,strong) NSDecimalNumber *latitude;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以像往常一样分配对对象的引用:

\n\n
_tagId = @0; // Or whatever you want.\n_latitude = [NSDecimalNumber zero];\n
Run Code Online (Sandbox Code Playgroud)\n\n

B. 简单地赋值

\n\n
_tagId = 0; // Or whatever you want. There is no nil for integers\n
Run Code Online (Sandbox Code Playgroud)\n\n

这对于整数很有用,但对于小数则不好,因为它们是带有struct私有组件的并且没有函数来创建它们。但是,您可以创建一个NSDecimalNumber实例对象(如 A. 中所示)并使用 获取十进制值-decimalValue

\n\n
_latitude = [[NSDecimalNumber zero] decimalValue];\n
Run Code Online (Sandbox Code Playgroud)\n\n

的用法NSDecimal对我来说似乎是错误的。为什么要使用它?通常,经度和纬度是double另一种标量类型,可以将其视为带有值的整数。十进制浮点对象用于财务软件。

\n