Ios 如何在Swift中制作Singleton

Ios 如何在Swift中制作Singleton,ios,swift,xcode,singleton,Ios,Swift,Xcode,Singleton,我想用Singleton来展示广告,但效果不好。 当我不使用Singleton并且只使用ViewController时,它工作得很好 我怎样才能解决它 模式1:当我使用Singleton时(无法加载和显示广告) 万帕德沃德·斯威夫特 import Foundation import UIKit import VAMP class VAMPAdReward: NSObject,VAMPDelegate{ static let sharedInstance = VAMPAdReward(

我想用Singleton来展示广告,但效果不好。 当我不使用Singleton并且只使用ViewController时,它工作得很好

我怎样才能解决它

模式1:当我使用Singleton时(无法加载和显示广告)

万帕德沃德·斯威夫特

import Foundation
import UIKit
import VAMP

class VAMPAdReward: NSObject,VAMPDelegate{

    static let sharedInstance = VAMPAdReward()

    var adReward:VAMP!

    override init() {
        super.init()

    }

    func loadAdReward(parentViewController: UIViewController) {
        adReward = VAMP()
        adReward.setPlacementId("26812") //test ID
        adReward.delegate = self
        adReward.setRootViewController(self)

    }

    func showAdReward(){
        if adReward.isReady() {
            print("show ad")
            adReward.show()
        }else{
            print("couldn't show ad")
        }
    }

    func vampLoadStart(_ placementId: String!, adnwName: String!) {
        print("start loading")
    }

    func vampDidReceive(_ placementId: String!, adnwName: String!) {
        print("finished loading")
    }
}
视图控制器

import UIKit

class ViewController: UIViewController {

    var adReward: VAMPAdReward!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.white

        VAMPAdReward.sharedInstance.loadAdReward(parentViewController: self)

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {


    super.touchesBegan(touches, with: event)

        //when touch screen, show Ad
        VAMPAdReward.sharedInstance.showAdReward()

    }
}
导入UIKit
类ViewController:UIViewController{
沃德:万帕德沃德!
重写func viewDidLoad(){
super.viewDidLoad()
self.view.backgroundColor=UIColor.white
Vampadeward.sharedInstance.LoadAddressward(parentViewController:self)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
super.touchesbeated(touches,with:event)
//触摸屏时,显示广告
VAMPAdReward.sharedInstance.showAdReward()
}
}
模式2:当我不使用Singleton时(可以加载并显示广告)

导入UIKit
进口鞋面
类ViewController:UIViewController、VAMPDelegate{
var广告:鞋面!
重写func viewDidLoad(){
super.viewDidLoad()
self.view.backgroundColor=UIColor.white
//加载广告
ad=鞋面()
ad.setPlacementId(“59755”)//测试ID
代表自己
ad.setRootViewController(自)
ad.load()
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
super.touchesbeated(touches,with:event)
广告秀
}
func vampLoadStart(uPlacementId:String!,adnwName:String!){
打印(“开始加载”)//通过
}
func VAMPDIRECEIVE(uPlacementId:String!,adnwName:String!){
打印(“已完成加载”)//通过
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
}

单例中的正确方法

func loadAdReward(parentViewController: UIViewController) {
    adReward = VAMP()
    adReward.setPlacementId("26812") //test ID
    adReward.delegate = self
    adReward.setRootViewController(parentViewController)
    adReward.load()
}

按照以下步骤完成您的singleton类

// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray : [String] = []

}

在Pattern1,VAMPAdReward类中的loadAdReward实现中,为什么“adReward.delegate=parentViewController as!VAMPDelegate”是因为您的ViewController显然不符合该协议,并且该委托的实现在VAMPAdReward中,所以不应该是singleton。很抱歉,我犯了错误。正如您所说,“adReward.delegate=self”是正确的。我更新了代码。我在singleton methodadReward.delegate=self中没有看到adReward.load()是正确的,但adReward.setRootViewController(self)是错误的,它应该是以前的版本,而不是adReward.setRootViewController(parentViewController),正如@Sh_Khan所提到的,.load()永远不会被调用感谢您的回答。我修正了我的代码,它工作得很好!!非常感谢,很抱歉这个问题太傻了……谢谢!这对我很有帮助。
// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray : [String] = []

}