I have a problem with Swift 2 (Swift 3) and Google Analytics.
我对Swift 2 (Swift 3)和谷歌分析有问题。
This is the line with the problem:
这就是问题所在:
tracker.send(GAIDictionaryBuilder.createScreenView().build())
Xcode tell's me:
Xcode告诉我:
Cannot invoke 'send' with an argument list of type '(NSMutableDictionary!)'
不能使用类型为'(NSMutableDictionary!)的参数列表调用'send'
6 个解决方案
#1
64
Update for Swift 3 (2016.10.19)
Swift 3更新(2016.10.19)
let tracker = GAI.sharedInstance().defaultTracker
let build = (GAIDictionaryBuilder.createScreenView().build() as NSDictionary) as! [AnyHashable: Any]
tracker?.send(build)
Still an ugly approach, let me know if there's an cleaner conversion.
仍然是一个丑陋的方法,让我知道是否有一个更清洁的转换。
Original
原始
Same here, struggling to resolve tons of errors.
这里也是一样,努力解决大量的错误。
What I did (deprecated):
我所做的(弃用):
var build = GAIDictionaryBuilder.createAppView().build() as [NSObject : AnyObject]
tracker.send(build)
Edit (2015)
编辑(2015)
Thanks to @George Poulos. . Recently they updated the options, now createAppView is deprecated, should use createScreenView instead.
感谢@George Poulos。最近他们更新了选项,现在createAppView被弃用了,应该使用createScreenView。
var build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
tracker.send(build)
#2
10
In addition to the accepted answer:
除了公认的答案之外:
Changed this:
改变:
tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build())
To this:
:
tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build() as [NSObject : AnyObject])
#3
5
This might be a bit of an overkill, but I prefer creating a short extension and not need to type the castings every time:
这可能有点过分,但我更喜欢创建一个短的扩展,而不是每次都需要输入铸件:
In any swift file, paste the following code:
在任何swift文件中,粘贴以下代码:
extension GAIDictionaryBuilder
{
func buildSwiftCompatible() -> [NSObject:AnyObject]
{
return self.build() as [NSObject:AnyObject]
}
}
Then you can call buildSwiftCompatible() instead of the usual build():
然后可以调用buildSwiftCompatible()而不是通常的build():
tracker.send(GAIDictionaryBuilder.createScreenView().buildSwiftCompatible())
Have fun.
玩得开心。
#4
0
This is a solution I came up with.. Maybe it could help some of you. It's a struct you need to instantiate in every UIViewController, but it helps with the boilerplate.
这是我想出的一个解决办法。也许对你们有些人有帮助。它是一个你需要在每个UIViewController中实例化的结构体,但是它对样板很有帮助。
import UIKit
struct Analytics {
fileprivate let viewController: UIViewController
fileprivate let tracker = GAI.sharedInstance().defaultTracker
init (forScreen viewController: UIViewController) {
self.viewController = viewController
}
func startTracking () {
let screenView = GAIDictionaryBuilder.createScreenView().build() as NSDictionary
guard
let tracker = tracker,
let build = screenView as? [AnyHashable: Any]
else { return }
tracker.set(kGAIScreenName, value: String(describing: viewController))
tracker.send(build)
}
}
class HomeViewController: UIViewController {
lazy var analytics: Analytics = {
return Analytics(forScreen: self)
}()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
analytics.startTracking()
}
}
#5
-1
For swift 3:
为迅速3:
let build:NSObject = GAIDictionaryBuilder.createScreenView().build()
.build让构建:NSObject = GAIDictionaryBuilder.createScreenView()()
tracker?.send(build as! [AnyHashable: Any])
跟踪器?。发送(建造![AnyHashable:任何])
#6
-2
let build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
让build = GAIDictionaryBuilder.createScreenView().build() as [NSObject: AnyObject]
tracker?.send(build)
追踪? .send(建立)
#1
64
Update for Swift 3 (2016.10.19)
Swift 3更新(2016.10.19)
let tracker = GAI.sharedInstance().defaultTracker
let build = (GAIDictionaryBuilder.createScreenView().build() as NSDictionary) as! [AnyHashable: Any]
tracker?.send(build)
Still an ugly approach, let me know if there's an cleaner conversion.
仍然是一个丑陋的方法,让我知道是否有一个更清洁的转换。
Original
原始
Same here, struggling to resolve tons of errors.
这里也是一样,努力解决大量的错误。
What I did (deprecated):
我所做的(弃用):
var build = GAIDictionaryBuilder.createAppView().build() as [NSObject : AnyObject]
tracker.send(build)
Edit (2015)
编辑(2015)
Thanks to @George Poulos. . Recently they updated the options, now createAppView is deprecated, should use createScreenView instead.
感谢@George Poulos。最近他们更新了选项,现在createAppView被弃用了,应该使用createScreenView。
var build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
tracker.send(build)
#2
10
In addition to the accepted answer:
除了公认的答案之外:
Changed this:
改变:
tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build())
To this:
:
tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build() as [NSObject : AnyObject])
#3
5
This might be a bit of an overkill, but I prefer creating a short extension and not need to type the castings every time:
这可能有点过分,但我更喜欢创建一个短的扩展,而不是每次都需要输入铸件:
In any swift file, paste the following code:
在任何swift文件中,粘贴以下代码:
extension GAIDictionaryBuilder
{
func buildSwiftCompatible() -> [NSObject:AnyObject]
{
return self.build() as [NSObject:AnyObject]
}
}
Then you can call buildSwiftCompatible() instead of the usual build():
然后可以调用buildSwiftCompatible()而不是通常的build():
tracker.send(GAIDictionaryBuilder.createScreenView().buildSwiftCompatible())
Have fun.
玩得开心。
#4
0
This is a solution I came up with.. Maybe it could help some of you. It's a struct you need to instantiate in every UIViewController, but it helps with the boilerplate.
这是我想出的一个解决办法。也许对你们有些人有帮助。它是一个你需要在每个UIViewController中实例化的结构体,但是它对样板很有帮助。
import UIKit
struct Analytics {
fileprivate let viewController: UIViewController
fileprivate let tracker = GAI.sharedInstance().defaultTracker
init (forScreen viewController: UIViewController) {
self.viewController = viewController
}
func startTracking () {
let screenView = GAIDictionaryBuilder.createScreenView().build() as NSDictionary
guard
let tracker = tracker,
let build = screenView as? [AnyHashable: Any]
else { return }
tracker.set(kGAIScreenName, value: String(describing: viewController))
tracker.send(build)
}
}
class HomeViewController: UIViewController {
lazy var analytics: Analytics = {
return Analytics(forScreen: self)
}()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
analytics.startTracking()
}
}
#5
-1
For swift 3:
为迅速3:
let build:NSObject = GAIDictionaryBuilder.createScreenView().build()
.build让构建:NSObject = GAIDictionaryBuilder.createScreenView()()
tracker?.send(build as! [AnyHashable: Any])
跟踪器?。发送(建造![AnyHashable:任何])
#6
-2
let build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
让build = GAIDictionaryBuilder.createScreenView().build() as [NSObject: AnyObject]
tracker?.send(build)
追踪? .send(建立)