Başlatıcı, 'dahili' koruma seviyesi nedeniyle erişilemez


92

Bazı protokollerim var

Giriş Yap

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
}

ve iki sınıf:

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 Giriş Stratejisi

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

Benim içinde ViewController :

Kullandığım zaman:

let facebookLoginProvider = LoginProvider(strategy: FacebookLoginStrategy())

Diyor ki:

"FacebookLoginStrategy", "dahili" koruma seviyesi nedeniyle erişilemez durumda

Yanıtlar:


258

Sadece FacebookLoginStratejinize ekleyin:

public init() {}

İnit () 'i açıkça uygulamadığınız sürece, varsayılan olarak dahili olarak işaretlenir. Çerçevenizin dışından örnekleyebilmek için bu izin düzeyinin üzerine yazmanız gerekir.


13
Mükemmel cevap! Ve Swift4'e dikkat edin, eğer uygulamazsanız bu aslında bir hatadır.
Paul Razvan Berg

2
Sadece sınıfa.
jboi

15
bu o kadar aptalca ki Swift bunu istiyor. Tüm sınıf türünü public olarak ilan edersem, ücretsiz init () de herkese açık olmalıdır
LightningStryk

3
Bu bir hata olmalıdır Swift. İçin işaretlediğimiz publiciçin derleyici hatası olmamalı class/struct.
lee

1
Başlangıcımdan önce genel ekledim ve hala aynı mesajı alıyorum. Başka bir koruma var mı?
AndreG

8

Buna bir XCTestCase içindeki kodla giriyorsanız, @testable import My-Awesome-Apptest dosyanızın en üstüne eklediğinizden emin olun .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.