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

标签 ios swift swift3 anyobject

我正在尝试在我的 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/

相关文章:

ios - 在observeSingleEvent 中变量的值没有改变

ios - 将相同类型的 SKAction 添加到 sprite 会覆盖之前的 Action 吗?

ios - pods 和模块之间有什么区别

swift3 - 在realm-swift中添加新的realm对象时是否需要迁移?

ios - 测试 "presentingViewController is UIViewController"在一种情况下工作正常,在其他情况下失败

ios - 带有自定义后退按钮字体的错误大标题动画

ios - swift 3 : Dismiss popup ViewController

ios - 当我向 TestFlight 添加新的测试人员时,我是否必须为他们提供一个新的版本 "notified"?

javascript - 适用于移动浏览器的 WEBRTC 屏幕捕获 API

当应用程序收到通知时,IOS 向 HTTP 服务器发送请求