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

时间:2017-07-03 13:13:50

标签: ios swift swift3 anyobject

我正在尝试使用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())
        }

所以,虽然我按照来自herehere

的原生广告广告的示例

首先我改变了

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个广告。

关于这个的任何想法?

1 个答案:

答案 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。我不认为将数据与视图混合是一种好习惯。你应该让你的数组保持清晰的视图,并让它只包含数据。