«результат» недоступен из-за «внутреннего» уровня защиты - PullRequest
2 голосов
/ 26 апреля 2019

Я хочу создать пользовательский фреймворк для универсального запроса API с использованием URLSession.Поэтому я использовал эту ссылку.Я буду использовать этот проект в качестве пользовательской основы.Поэтому, чтобы использовать это, я изменил его спецификатор доступа на open. И используя эту ссылку, я импортировал ее в свой проект.И я сделал следующий код для вызова пост-запроса

import iOSCoreFramework

func callBySpeedyNetworking2() {
    let trylogin = login(username: "****", password: "***")
    SpeedyNetworking.removeToken()
    SpeedyNetworking.postUrl(url: URL(string: GlobalConstants.loginFullURL), model: trylogin) { (response) in
        if !response.success {
            // show a network error
            print("network error ",response.error)
            return
        }
        // successful
        print("RESPONSE 1 ------------> ")
        dump(response.result(model: ModelResponse.self))
        dump(response.jsonResults(model: ModelResponse.self))
    }
}

Но он дает мне ошибку для «success», «error» и в следующих строках:

dump(response.result(model: ModelResponse.self))
dump(response.jsonResults(model: ModelResponse.self))

Fromразличные ссылки Я внес изменения в класс SpeedyResponse с помощью следующего

public class SpeedyResponse {

public var success : Bool!
public var statusCode = 0
public var error: Error?
public var data: Data?
public init (success : Bool, statusCode : Int,error :  Error, data : Data){
    self.success = success
    self.statusCode = statusCode
    self.error = error
    self.data = data
}

public init(data: Data?, response: URLResponse?, error: Error?) {
    self.error = error
    self.data = data

    if let httpResponse = response as? HTTPURLResponse {
        statusCode = httpResponse.statusCode
    }

    success = statusCode == 200 && error == nil && data != nil ? true : false
}

public func jsonResults<T>(model: T.Type) -> T? {
    if !success { return nil }
    guard let responseData = data else { return nil }

    do {
        return try JSONSerialization.jsonObject(with: responseData) as? T
    } catch {
        return nil
    }
}

public func result<T: Decodable>(model: T.Type) -> T? {
    if !success { return nil }
    guard let responseData = data else { return nil }

    do {
        return try JSONDecoder().decode(model, from: responseData)
    } catch {
        return nil
    }
}

}

Но все же это не было исправлено.

1 Ответ

0 голосов
/ 26 апреля 2019

Основная проблема находится внутри вашего struct, все переменные и методы объявляются автоматически с областью действия internal. Поэтому, когда вы создаете такой тип:

public class Human {
    let foo: String
    let bar: String
}

Вы не сможете получить доступ к foo и bar, поскольку они фактически объявлены как:

public class Human {
    internal let foo: String
    internal let bar: String
}

Чтобы это исправить, просто добавьте модификатор доступа к public.


В этом смысле ваша новая модель должна выглядеть следующим образом

public class SpeedyResponse {

    public var success: Bool!
    public var statusCode = 0
    public var error: Error?
    public var data: Data?

    public init(data: Data?, response: URLResponse?, error: Error?) {
        self.error = error
        self.data = data

        if let httpResponse = response as? HTTPURLResponse {
            statusCode = httpResponse.statusCode
        }

        success = statusCode == 200 && error == nil && data != nil ? true : false
    }

    public func jsonResults<T>(model: T.Type) -> T? {
        if !success { return nil }
        guard let responseData = data else { return nil }

        do {
            return try JSONSerialization.jsonObject(with: responseData) as? T
        } catch {
            return nil
        }
    }

    public func result<T: Decodable>(model: T.Type) -> T? {
        if !success { return nil }
        guard let responseData = data else { return nil }

        do {
            return try JSONDecoder().decode(model, from: responseData)
        } catch {
            return nil
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...