我正在尝试在我的 iOS 项目中使用 swift 实现 Native Express Ads。
首先我有一个类
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
}
//...
}
哪个类从互联网获取 JSON 并填充表格 View 。 我也有一些功能,比如搜索事件的名称,还有一个按日期过滤事件的按钮。 所有这些都适用于下面的代码
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())
}
因此,当我按照 here 中的原生快速广告示例进行操作时和 here
首先我改变了
var eventData = [Events]()
var filteredEvents = [Events]()
到
var eventData = [AnyObject]()
var filteredEvents = [AnyObject]()
所以广告可以附加到数组中,如下面的函数 addNativeExpressAds()
所示!
我对函数 sort()
和 filter
有疑问。
对于 sort()
它说 Value of type 'AnyObject' has no member 'realDate'
对于 filter
,它表示 Value of type 'AnyObject' has no member 'eventName'
更新 1。
在对谷歌进行一些研究后,我发现这可能是 sort()
函数的解决方案
eventData.sort() { (($0 as! Events).realDate ) < ($1 as! Events).realDate }
虽然 eventData
数组还包含 GADNativeExpressAdView
因为在我上面链接的示例中有这段代码可以下载 express native ads 并将它们附加到AnyObject
数组 eventData
见下文
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).
所以我无法对任何对象的数组进行排序,因为我的数组中有 GADNativeExpressAdView
广告。
对这个有什么想法吗?
最佳答案
首先,在您的 sort
函数中,您强制将 !
强制转换为 Event
类型,但您的数组不仅包含 仅限事件
对象。因此,您强制转换,您的代码失败了。
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
}
这是一个示例代码,我还没有测试它是否按预期工作,但它应该能让您了解如何继续。
附言我认为将数据与 View 混合不是一个好习惯。您应该保持数组中没有 View ,并且只包含数据。
关于ios - Google Mobile Native Express 广告 iOS - [AnyObject] 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44886532/