Google Mobile Native Express广告iOS-与[AnyObject]有关的问题
我正试图在我的iOS项目中使用swift实现Native Express广告 首先我有一节课Google Mobile Native Express广告iOS-与[AnyObject]有关的问题,ios,swift,swift3,anyobject,Ios,Swift,Swift3,Anyobject,我正试图在我的iOS项目中使用swift实现Native Express广告 首先我有一节课 class Events { var _eventName: String! var _realDate: Date! var realDate: Date { if _realDate == nil { _realDate = nil } return _realDate } var event
class Events {
var _eventName: String!
var _realDate: Date!
var realDate: Date {
if _realDate == nil {
_realDate = nil
}
return _realDate
}
var eventName: String {
if _eventName == nil {
_eventName = ""
}
return _eventName
}
//...
}
哪个类从internet获取JSON并填写tableview。
此外,我还有一些类似于搜索事件名称的功能,还有一个按日期过滤事件的按钮。
所有这些都可以使用下面的代码正常工作
var eventData = [Events]()
var filteredEvents = [Events]()
eventData.sort() { $0.realDate < $1.realDate }
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredEvents = eventData.filter { events in
return events.eventName.lowercased().contains(searchText.lowercased())
}
到
因此,ads可以附加到数组中,如我在下面的函数addNativeExpressAds()
中所示!
我对函数sort()
和过滤器有问题
对于sort()
它说类型为“AnyObject”的值没有成员“realDate”
对于filter
来说,类型为“AnyObject”的值没有成员“eventName”
更新1。
在谷歌上做了一些研究之后,我发现这可能是sort()
函数的解决方案
eventData.sort() { (($0 as! Events).realDate ) < ($1 as! Events).realDate }
通过这个,我得到了错误
Could not cast value of type 'GADNativeExpressAdView' (0x10046ebd8) to 'Events_Near_Me.Events' (0x10046fb90).
因此,我无法对任何对象的数组进行排序,因为数组中出现了GADNativeExpressAdView
广告
你知道这个吗?首先,在你的排序功能中,你可以强制执行一个cast
到事件
类型,但您的数组不仅包含事件
对象。因此,如果强制强制强制转换,代码将失败
eventData.sort { (first, second) in
if let first = first as? Event,
let second = second as? Event {
return first.realDate < second.realDate
}
if let fist = first as? GADNativeExpressAdView,
let second = second as? GADNativeExpressAdView {
return \\ compare?
}
return false
}
eventData.sort{(第一,第二)在
如果let first=first as?事件,
设秒=秒为?事件{
返回first.realDate
这是一个示例代码,我还没有测试它是否如预期的那样工作,但它应该给你一个如何继续的想法
另外,我认为将数据与视图混合使用不是一个好的做法。您应该保持数组中没有视图,并且只包含数据。不相关,但在Swift中使用带有备份实例变量的属性来获取常量是荒谬的。只需编写让realDate:Date,让eventName:String
并编写一个初始值设定项。第二:如果要在一个数组中组合两种不同的类型,请编写一个两种类型都符合的协议,并将该协议用作类型,而不是AnyObject
,这通常是最糟糕的方式。@vadian嘿!虽然我没有写下整个类,但是有一个initilizer。关于协议
如果可以的话,你能给我举个例子吗?不幸的是,没有关于GADNativeExpressAdView
和事件
的相关信息。也许谷歌的家伙在没有利用Swift的特殊功能的情况下将他们的代码从Objective-C翻译成了Swift。奇怪的后台实例变量看起来很像google translate;-)是的,我知道。但我只是想让你看看其他的选择。其中一个()实现了瓦迪安建议的协议。
func addNativeExpressAds() {
var index = adInterval
// Ensure subview layout has been performed before accessing subview sizes.
nearMeTable.layoutIfNeeded()
while index < eventData.count {
let adSize = GADAdSizeFromCGSize(
CGSize(width: nearMeTable.contentSize.width, height: adViewHeight))
guard let adView = GADNativeExpressAdView(adSize: adSize) else {
print("GADNativeExpressAdView failed to initialize at index \(index)")
return
}
adView.adUnitID = adUnitID
adView.rootViewController = self
adView.delegate = self
eventData.insert(adView, at: index) //here it inserts the ads
adsToLoad.append(adView)
loadStateForAds[adView] = false
index += adInterval
}
}
Could not cast value of type 'GADNativeExpressAdView' (0x10046ebd8) to 'Events_Near_Me.Events' (0x10046fb90).
eventData.sort { (first, second) in
if let first = first as? Event,
let second = second as? Event {
return first.realDate < second.realDate
}
if let fist = first as? GADNativeExpressAdView,
let second = second as? GADNativeExpressAdView {
return \\ compare?
}
return false
}