简体   繁体   中英

Cannot convert value of type NSMutableDictionary? to expected argument type [NSObject: AnyObject]!

i wanted to jump over to use Xcode 8 beta and convert my code, but I'm facing some kind of problem here, i am using Google Analytics SDK to send events,and this is how i used to use it in Swift 2.2 :

    let tracker = GAI.sharedInstance().defaultTracker
    tracker?.set(kGAIScreenName, value: "ViewController")
    let builder = GAIDictionaryBuilder.createScreenView()
    tracker?.send(builder?.build() as [NSObject:AnyObject])

But now i want to use Swift 3, its telling me :

Cannot convert value of type NSMutableDicationary to type [NSObject : AnyObject] in coercion.

You need to make a variable to hold your NSMutableDictionary then pass it to send() method.

let dictionary = (builder?.build())! as NSMutableDictionary
tracker?.send(dictionary as [NSObject: AnyObject]!)

UPDATE: Another clean way to use in Swift 3

guard let tracker = GAI.sharedInstance().defaultTracker else { return }
tracker.set(kGAIScreenName, value: "ViewController")
guard let builder = GAIDictionaryBuilder.createScreenView() else { 
return }
tracker.send(builder.build() as [NSObject:AnyObject])

I think this will solve the issue. It is always good to unwrap optionals before use them directly, Otherwise you may regret later.

 if let tracker = GAI.sharedInstance().defaultTracker, builder = GAIDictionaryBuilder.createScreenView()
 {                
    if let dict = builder.build(), mutableDict = dict as [NSObject: AnyObject]?
     {
       tracker.send( mutableDict )
     }
 }

SWIFT 3

for screen tracking use below code

    func trackScreen(screenName:String){  
            let tracker = GAI.sharedInstance().defaultTracker     
            tracker?.set(kGAIScreenName, value: screenName) 
            let builder:NSObject = GAIDictionaryBuilder.createScreenView().build()      
            tracker?.send(builder as! [NSObject:AnyObject]) 
         }

for event Tracking

func eventTracking(){
    let tracker = GAI.sharedInstance().defaultTracker
    let builder:NSObject = GAIDictionaryBuilder.createEvent(
    withCategory:"categoryName",
    action:"ok button Clicked",
    label:"button name",
    value:nil).build()
    tracker?.send(builder as! [NSObject:AnyObject])
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM