2016-06-26 65 views
10

volevo saltare oltre per usare Xcode 8 beta e convertire il mio codice, ma sto affrontando un qualche tipo di problema qui, sto usando l'SDK di Google Analytics per inviare eventi, ed è così che usavo usarlo in Swift 2.2 :Impossibile convertire il valore di tipo NSMutableDictionary? al tipo di argomento previsto [NSObject: AnyObject]!

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

Ma ora voglio usare Swift 3, la sua dicendomi:

non può convertire il valore di tipo NSMutableDicationary digitare [NSObject: ANYOBJECT] in coercizione.

risposta

17

Hai bisogno di fare una variabile per tenere il vostro NSMutableDictionary poi passarlo al send() metodo.

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

UPDATE: Un altro modo pulito da utilizzare 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]) 
+0

o: inseguitore Trasmettami (((? costruire er? .build())! come NSMutableDictionary) come [NSObject: AnyObject]!) –

+1

Lifesaver! Grazie! – LinusGeffarth

2

Penso che questo risolverà il problema. È sempre bene scartare gli optionals prima di usarli direttamente, altrimenti potresti pentirti più tardi.

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

SWIFT 3

per l'uso di monitoraggio schermata sottostante Codice

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

per l'evento di monitoraggio

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