ios - 由于 'internal' 保护级别,初始化程序无法访问

标签 ios swift frameworks access-modifiers initializer

我有一个协议(protocol)

登录策略

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
}

和两个类:

登录提供者

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
    }
    
}

FacebookLoginStrategy

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' is inaccessable due to 'internal' protection level

最佳答案

只需添加到您的 FacebookLoginStrategy:

public init() {}

只要你没有显式地实现 init(),默认情况下它被标记为内部的。您需要覆盖该权限级别才能从框架外部实例化。

关于ios - 由于 'internal' 保护级别,初始化程序无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859139/

相关文章:

ios - 从可变数组或字典中设置按钮标题和操作?

c# - .NET WinForms 应用程序的 MVC/MVP 框架

python - nginx/gunicorn Django Rest Framework 应用的端口代理

ios - 我如何在我的项目中运行 XCTest 时发生运行时错误

ios - 快速通过 NSNotificationCenter 发送和接收消息?

ios - NKLibrary 在 iOS 11.3 中初始化时崩溃

ios - 如何防止我不知道的对象上的 EXC_BAD_ACCESS 在 iOS 9 中发布?

ios - 无法从主 UIViewController 访问嵌入式 UICollectionView

ios - 如何在 Swift 中更改页面 View 点的位置?

ios - 尝试使用 replaykit ios 在直播中启动无效的广播 session