2017-07-03 64 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.我認爲將數據與視圖混合並不是一個好習慣。您應該保持陣列清理視圖並使其僅包含數據。