Google Mobile Native Express 广告 iOS - [AnyObject] 的问题

Google Mobile Native Express ads iOS - Issues with [AnyObject]

我正在尝试在我的 iOS 项目中使用 swift.

实施 Native Express Ads

首先我有一个class

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
    }

//...
}

class 从 Internet 获取 JSON 并填充表格视图。 我也有一些功能,比如搜索事件的名称,还有一个按日期过滤事件的按钮。 所有这些都适用于下面的代码

var eventData = [Events]()
var filteredEvents = [Events]()

eventData.sort() { [=13=].realDate < .realDate }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filteredEvents = eventData.filter { events in
            return events.eventName.lowercased().contains(searchText.lowercased())
        }

因此,虽然我遵循了 here and 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。 在对 google 进行一些研究后,我发现这可能是 sort() 函数

的解决方案
eventData.sort() { (([=16=] as! Events).realDate ) < ( as! Events).realDate }

虽然 eventData 数组还包含 GADNativeExpressAdView 因为在我上面链接的示例中有这段代码可以下载 express native 广告并将它们附加到 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 类型,但您的数组不仅包含 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。我认为将数据与视图混合不是一个好习惯。你应该保持你的数组没有视图并且只包含数据。