Objective-C – Тип приемника «NSInteger» (иначе «long») не является классом Objective-C & Receiver «NSDecimal» не является классом Objective-C

Я получаю ошибки в заголовке, и я понятия не имею, почему ….

.час

@interface ItemData : NSObject @property (nonatomic,assign) NSInteger tagId; @property (nonatomic,strong) NSMutableString *deviceId; @property (nonatomic,strong) NSDecimal *latitude; @property (nonatomic,strong) NSDecimal *longitude; @end 

.m

 #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 

Я не понимаю, что я делаю неправильно … может кто-то мне помочь?

NSInteger и NSDecimal являются классами, а типами скаляров. Вы не можете отправлять сообщения в «объекты» (в смысле C, а не в смысле ООП) этого типа. Поэтому вы не создаете их с помощью +alloc -init… и -init…

У вас есть две возможности:

A. Использование (OOP) объектов вместо скаляров

 @property (nonatomic,assign) NSNumber *tagId; @property (nonatomic,strong) NSDecimalNumber *latitude; 

Затем вы можете назначить ссылки на объекты как обычно:

 _tagId = @0; // Or whatever you want. _latitude = [NSDecimalNumber zero]; 

B. Просто присвойте значение

 _tagId = 0; // Or whatever you want. There is no nil for integers 

Это полезно для целых чисел, но плохо для десятичных знаков, поскольку они представляют собой struct с частными компонентами, и нет никакой функции для их создания. Однако вы можете создать экземпляр NSDecimalNumber (как в A.) и получить десятичное значение с -decimalValue .

 _latitude = [[NSDecimalNumber zero] decimalValue]; 

Использование NSDecimal кажется ошибочным для меня. Почему вы хотите его использовать? Обычно долгота и широта являются double , еще одним скалярным типом, которые можно рассматривать как целые числа со значениями. Десятичные объекты с плавающей точкой предназначены для использования в программном обеспечении финансов.

NSInteger –

 typedef long NSInteger; 

Это должно объяснить «NSInteger (aka« long »)», и это эквивалентно 64-битовому (длинному int) C типу данных. Это не класс OC, поэтому вы не можете делать (+) alloc и (-) init.

Давайте будем гением компьютера.