Создание функции «inout» с Objective C - PullRequest
0 голосов
/ 06 апреля 2020

Итак, я перевожу проект в Swift 5.1 с цели C. В настоящее время у меня есть фрагмент кода, который следующий, уже в Swift:

    func getStoryDetail(with jsonDict: inout [AnyHashable : Any] , success: NetworkManagerSuccess, failure: NetworkManagerFailure) {

        manager?.post("CUSTOM_API_URL", parameters: jsonDict, progress: nil, success: { operation, responseObject in
            if let responseObject = responseObject {
                print("\(responseObject)")
            }
            //success(responseObject)
        }, failure: { operation, error in

                print("\n\nFailed: Error:\n: \(error)")

            //failure(error)
        })
    }

И я вызываю эту функцию в Objective C, используя заголовок моста:

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
[jsonDict setValue:[NSString stringWithFormat:@"%d", pageNumber] forKey:kPage];
[jsonDict setValue:storyId forKey:kStoryId];

[[StoryService sharedManager] getStoryDetailWith:jsonDict success:^(id responseObject) {
        [SVProgressHUD dismiss];
        isLoading = NO;

        if (![responseObject isEqual:[NSNull null]]) {
            NSString *responseCode = [responseObject objectForKey:@"ResponseCode"];

            if ([responseCode isEqualToString:@"1"]) {
                NSMutableArray *arrNewList = [[responseObject objectForKey:@"Result"] mutableCopy];
                if (arrNewList.count == 0) {
                    shouldLoadMore = NO;
                } else {
                    if (pageNumber == 1) {
                        arrayStoryConversation = arrNewList;
                        [self loadNextMessage];
                    } else {
                        [arrayStoryConversation addObjectsFromArray:arrNewList];
                    }
                    pageNumber++;
                    shouldLoadMore = YES;
                    if (arrayStoryConversation.count == [[responseObject objectForKey:@"TotalCount"] intValue]) {
                        shouldLoadMore = NO;
                    }
                }
                if ([responseObject objectForKey:@"Next_result"]) {
                    _nextStory = [responseObject objectForKey:@"Next_result"];
                }
            } else {
                shouldLoadMore = NO;
                [self showALertViewWithTitle:@"Oops!" withText:[responseObject objectForKey:@"ResponseMessage"] andButtonText:@"Ok"];
            }

            intTotalLikes = [[responseObject objectForKey:klike_count] intValue];
            intTotalComment = [[responseObject objectForKey:kcomment_Count] intValue];
            if ([[responseObject objectForKey:kUserlike] isEqualToString:@"1"]) {
                isFavStory = YES;
            } else {
                isFavStory = NO;
            }
            [self.tblStory reloadData];

        } else {
            [self getConversationList:showLoader];
        }

    } failure:^(NSError *error) {
        isLoading = NO;
        [SVProgressHUD dismiss];
        NSString *message;
        BOOL showCancelButton = YES;
        if (error.code == NSURLErrorTimedOut) {
            showCancelButton = NO;
            message = @"Request time out.";
        } else if (error.code == NSURLErrorNotConnectedToInternet || error.code == NSURLErrorCannotConnectToHost || error.code == NSURLErrorNetworkConnectionLost) {
            showCancelButton = NO;
            message = @"Internet connection goes down.";
        } else if (error.code == NSURLErrorBadServerResponse) {
            showCancelButton = YES;
            message = @"Any technical problem on server side.";
        } else {
            showCancelButton = NO;
            message = @"Request couldn't be completed.";
        }

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Failed" message:message preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *actionTryAgain = [UIAlertAction actionWithTitle:@"Try Again" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            [self getConversationList:showLoader];
        }];
        [alertController addAction:actionTryAgain];

        if (showCancelButton) {
            UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            }];
            [alertController addAction:actionCancel];
        }

        [self presentViewController:alertController animated:YES completion:nil];
    }];

Я получаю следующую ошибку: Нет видимого @interface для 'StoryService', объявляется селектор 'getStoryDetailWith: success: fail:' * . Затем, посмотрев, я понял, что это связано с функцией SWIFT, имеющей «inout», которая явно не совместима с Objective C. Я попытался добавить UnsafeMutablePointer<Anyhashble>, но он тоже не работает.

Кто-нибудь может мне помочь решить это, пожалуйста? Я действительно застрял.

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2020

После предложений двух пользователей ( Paulw11 и Роб ) я наконец решил просто стереть поведение "inout", и это не доставило никаких проблем.

...