1

我正在尝试在我的 iOS 项目中快速实现 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
    }

//...
}

哪个类从 Internet 获取 JSON 并填写表格视图。我也有一些功能,比如搜索事件的名称,还有一个按日期过滤事件的按钮。所有这些都可以使用下面的代码正常工作

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我的数组中出现广告。

对这个有任何想法吗?

4

1 回答 1

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
}

这是一个示例代码,我尚未对其进行测试以查看它是否按预期工作,但它应该让您了解如何继续。

PS 我认为将数据与视图混合不是一个好习惯。您应该保持数组中没有视图,并且只包含数据。

于 2017-07-04T15:15:45.503 回答