2017-07-03 65 views
2

我试图在iOS项目中使用swift实现Native Express Ads。所有的Google移动原生快车广告iOS - 有关[AnyObject]的问题

首先我有一个类

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和它填补了实现代码如下。 另外我有这样的一些功能搜索事件的名称,也有一个按日期过滤事件的按钮。 所有这些虽然我从here遵循本地快递广告的例子,here

首先我改变

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

工作正常下面

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 = [AnyObject]() 
var filteredEvents = [AnyObject]() 

So th电子广告可以追加到阵列,如下面的功能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

不相关,但具有支持实例变量以获取常量的属性在Swift中是荒谬的。只要写'let realDate:Date,让eventName:String'并**写一个初始化程序**即可。其次,如果你想在一个数组中组合两种不同的类型,写一个协议,这两种类型都符合,并使用协议作为类型,而不是AnyObject,这总是更糟糕的方式。 – vadian

+0

@vadian嘿!尽管我没有写下整个“课程”,但还是有一个启动者。如果可以的话,你可以给我一个关于“协议”的例子吗? –

+0

不幸的是,没有任何信息如何与'GADNativeExpressAdView'和'Events'相关。 – vadian

回答

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.我认为将数据与视图混合并不是一个好习惯。您应该保持阵列清理视图并使其仅包含数据。