我正在尝试使用swift在我的iOS项目中实现Native Express广告。
首先,我有一个班级
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并填写了一个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())
}
的原生广告广告的示例
首先我改变了
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
,但在我上面链接的示例中,有一段代码可下载快速原生广告并将其附加到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
个广告。
关于这个的任何想法?
答案 0 :(得分:2)
首先,在您的sort
函数中强制转换!
到Event
类型,但您的数组不仅仅包含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
}
这是一个示例代码,我没有对其进行测试,看它是否按预期工作,但它应该让您知道如何继续。
P.S。我不认为将数据与视图混合是一种好习惯。你应该让你的数组保持清晰的视图,并让它只包含数据。