Цель С Функция не вызывается в быстром классе - PullRequest
0 голосов
/ 09 мая 2018

Я использую Objective c и swift в моем проекте. При доступе к одной функции одноэлементного класса цели c в моем быстром классе она недоступна, в то время как другие функции доступны.

    I am writing my code below for both objective-c (.m,.h) and for swift classes.

Код для .h:

@property (nonatomic, readwrite) NSString* apiKey;
@property (nonatomic, readwrite) UIColor* panelColor;

+(id)sharedTools;
-(void)showProgressHud:(UIView *)view;
-(void)setApiKey:(NSString *)apiKey;
-(void)setPanelColor:(UIColor *)panelColor;
-(void)showProgressIndicator;
-(void)hideProgressIndicator;
-(void)hideProgressHud;
-(void)updateDeviceInformationWithDeviceToken:(NSString*)devicetoken;
- (void)prepareDeviceInformation;
-(void)getCurrentLocation;

Код для .m:

@implementation Constants

@synthesize location_Manager;

+ (id)sharedTools {
    static Constants *tools = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        tools = [[self alloc] init];
    });
    return tools;
}

- (void)setApiKey:(NSString *)apiKey {
    if (apiKey) {
        _apiKey = apiKey;
    }
    else {
        _apiKey = @"";
    }
}

- (void)setPanelColor:(UIColor *)panelColor {
    if (panelColor) {
        _panelColor = panelColor;
    }
}

В .swift:

 ref?.observe(DataEventType.value, with: { (snapShot:DataSnapshot) in
                let apiKeySnapshotResponse = snapShot.value as! [String:Any]
                if NSRUtilities.isNilOREmptyDictionary(apiKeySnapshotResponse) == false {
                    let apiKey = "\(String(describing: apiKeySnapshotResponse["key"]))"
                     (Constants.sharedTools()as AnyObject).setApikey(apiKey:apiKey)
                    OUSTConnectionManager.shareInstance().setApikey(apiKey:apiKey)

Пока эта функция работает нормально в классе swift.

func configuringCourses(){
        weak var weakSelf = self
        (Constants.sharedTools() as AnyObject).showProgressIndicator()
        let userKey = self.signInUserDetails["studentKey"] as! NSNumber
        let userCourseKey = 
 IMERLANDINGPAGE_URL.replacingOccurrences(of: "{userKey}", with: String(describing: userKey))
        let courseURL = "\(FIREBASE_URL)\(userCourseKey)/course"
        ref = Database.database().reference(fromURL: courseURL)

Помоги мне с этим. П.С .: Доступны другие функции цели c.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

+ (id)sharedTools и Constants.sharedTools() as AnyObject ваша проблема.

id в Objective-C соединен с типом Any Свифта. Поэтому возвращение любого, когда вы знаете, каким будет тип ответа, вызывает проблему.

Изменение:

+ (id)sharedTools

Кому:

+ (instancetype)sharedTools

Это вернет тип как константы, и автозаполнение будет знать, какой тип искать. В этом другом ответе

есть хорошее объяснение того, почему следует использовать instancetype вместо имени класса.

EDIT

Используя другие (текущие ответы) каждый раз, когда вы используете Constants.sharedTools в Swift, вам нужно будет дважды ввести имя класса:

(Constants.sharedTools() as! Constants).apiKey = "123"

Если вы используете instancetype в классе Objective-C, вам не нужно приводить тип, так как он возвращает правильный тип в первую очередь:

Constants.sharedTools().apiKey = "123"
0 голосов
/ 09 мая 2018

На самом деле это приведение к Constants как ответ @Sh_Khan:

(Constants.sharedTools() as! Constants).apiKey = "123"

Я проверял это.

Потому что это установщик свойств. Вы устанавливаете значение равным.

В то время как метод без свойств может быть вызван с индикатором функции ()

0 голосов
/ 09 мая 2018

Не приводите его к AnyObject, ставьте его как имя класса

(Constants.sharedTools() as AnyObject)

до

(Constants.sharedTools() as Constants)
...