'অভ্যন্তরীণ' সুরক্ষা স্তরের কারণে ইনিশিয়ালাইজার অ্যাক্সেসযোগ্য


92

আমার কিছু প্রোটোকল আছে

লগইনস্ট্রেটজি

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
    }

}

ফেসবুকলিনস্ট্রেটজি

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

আমার ভিউকন্ট্রোলারে :

যখন আমি ব্যবহার করি:

let facebookLoginProvider = LoginProvider(strategy: FacebookLoginStrategy())

এটা বলে:

'অভ্যন্তরীণ' সুরক্ষা স্তরের কারণে 'ফেসবুকলিনস্ট্রেটজি' অ্যাক্সেসযোগ্য

উত্তর:


257

কেবল আপনার ফেসবুকলগিনস্ট্রিতে যুক্ত করুন:

public init() {}

যতক্ষণ আপনি স্পষ্টভাবে init () প্রয়োগ করেন না, ততক্ষণ এটি ডিফল্টরূপে অভ্যন্তরীণ হিসাবে চিহ্নিত হবে। আপনার কাঠামোর বাইরে থেকে তাত্ক্ষণিকভাবে সক্ষম হতে আপনাকে সেই অনুমতি স্তরটি ওভাররাইট করতে হবে।


13
দুর্দান্ত উত্তর! এবং সুইফট ৪-এর দিকে নজর রাখুন, আপনি যদি এটি প্রয়োগ না করেন তবে এটি আসলে একটি ত্রুটি।
পল রাজ্জান বার্গ

4
সবে ক্লাসে।
jboi

15
এটি এতটাই বোবা যে সুইফ্টের এটির প্রয়োজন। আমি যদি পুরো শ্রেণীর ধরণের পাবলিক ঘোষণা করি তবে ফ্রি আর ()
লাইটনিংস্ট্রিটকের

4
এটি একটি বাগ করা উচিত Swift। এটা কম্পাইলার একটি ত্রুটি না যেহেতু আমরা চিহ্নিত করেছিলেন উচিত publicজন্য class/struct
লি

4
আমি আমার উদ্যোগের আগে সর্বসাধারণকে যুক্ত করেছি এবং এখনও আমি একই বার্তাটি পাচ্ছি। অন্য সুরক্ষা আছে?
আন্দ্রেজি

8

আপনি যদি কোনও এক্সটিস্টেস্টের মধ্যে কোডটিতে এইটি চালাচ্ছেন তবে নিশ্চিত হয়ে নিন যে আপনি @testable import My-Awesome-Appনিজের পরীক্ষার ফাইলের শীর্ষে যুক্ত করেছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.