'내부'보호 수준으로 인해 이니셜 라이저에 액세스 할 수 없습니다.


89

몇 가지 프로토콜이 있습니다

로그인 전략

public protocol LoginStrategy {
    func login(_ viewController: UIViewController)
    func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ())
    func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ())
    func getUserId() -> String
}

두 개의 클래스 :

LoginProvider

public class LoginProvider {

    public let strategy: LoginStrategy

    public func login(_ viewController: UIViewController) {
        return self.strategy.login(viewController)
    }

    public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) {
        return self.strategy.getUserInfo(withCompletionHandler: completionHandler)
    }

    public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) {
        return self.strategy.createLoginButton(frame, withCompletionHandler: completionHandler)
    }

    public func getUserId() -> String {
        return self.strategy.getUserId()
    }

    public init(strategy: LoginStrategy) {
        self.strategy = strategy
    }

}

Facebook 로그인 전략

import Foundation
import FacebookCore
import FacebookLogin

public class FacebookLoginStrategy: LoginStrategy {

    public var grantedPermissions: Set<Permission>? = nil

    public var declinedPermissions: Set<Permission>? = nil

    public var userId: String = ""

    public func login(_ viewController: UIViewController) {
        let loginManager = LoginManager()
        let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email]
        loginManager.logIn(permissions, viewController: viewController) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
            case .cancelled:
                print("User cancelled login.")
            case .success(let grantedPermissions, let declinedPermissions, let accessToken):
                self.userId = accessToken.userId ?? ""
                self.grantedPermissions = grantedPermissions
                self.declinedPermissions = declinedPermissions
                print("Logged in!")
            }
        }
    }

    public func getUserId() -> String {
        return userId
    }

    public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) {
        let request = GraphRequest(graphPath: "me", parameters: ["fields":"email, name"], accessToken: AccessToken.current, httpMethod: .GET, apiVersion: FacebookCore.GraphAPIVersion.defaultVersion)
        request.start { (response, result) in
            switch result {
            case .success(let value):
                print(value.dictionaryValue)
                completionHandler(value.dictionaryValue)
            case .failed(let error):
                print(error)
            }
        }
    }

    public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) {
        let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email]
        let loginButton = LoginButton(readPermissions: permissions)
        loginButton.frame = frame
        completionHandler(loginButton)
    }
}

ViewController에서 :

내가 사용할 때 :

let facebookLoginProvider = LoginProvider(strategy: FacebookLoginStrategy())

그것은 말한다 :

'내부'보호 수준으로 인해 'FacebookLoginStrategy'에 액세스 할 수 없습니다.

답변:


250

FacebookLoginStrategy에 추가하기 만하면됩니다.

public init() {}

init ()를 명시 적으로 구현하지 않는 한 기본적으로 내부로 표시됩니다. 프레임 워크 외부에서 인스턴스화 할 수 있으려면 해당 권한 수준을 덮어 써야합니다.


13
좋은 대답입니다! 그리고 Swift4를 조심하세요. 구현하지 않으면 실제로는 오류입니다.
Paul Razvan Berg

2
그냥 수업에.
jboi

12
이건 너무 멍청해서 Swift가 필요합니다. 전체 클래스 유형을 public으로 선언하면 무료 init ()도 public으로 제공되어야합니다
LightningStryk

3
이것은 Swift. 을 표시했기 때문에 컴파일러 오류가 아니어야 public합니다 class/struct.

1
init 전에 public을 추가했는데 여전히 동일한 메시지를 받고 있습니다. 또 다른 보호가 있습니까?
AndreG

8

XCTestCase 내의 코드에서 이것을 실행하는 경우 @testable import My-Awesome-App테스트 파일의 맨 위에 추가했는지 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.