2017-07-03 5 views
2

iOSプロジェクトにNative Express広告を迅速に実装しようとしています。Google Mobile Native Express広告iOS - [AnyObject]の問題

まず第一に、私は、インターネットからJSONを取得し、それがテーブルビューに記入されたクラスクラス

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 
    } 

//... 
} 

を持っています。 また、私はこのようないくつかの機能を持っているイベントの名前を検索し、また、日付でイベントをフィルタリングするボタンがあります。 はすべて私がherehere

まずからネイティブ特急広告の例を踏襲しながら、これらはそう

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 Googleでいくつかの研究の後、私はこれがsort()機能

eventData.sort() { (($0 as! Events).realDate) < ($1 as! Events).realDate } 
のための解決策になる可能性が出たと言います

eventDataアレイにはGADNativeExpressAdViewも含まれていますが、この例ではリンク済みです急行ネイティブ広告をダウンロードし、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). 

を取得AnyObject配列にそれらを追加し、このコードのブロックがあり、上記任意のオブジェクトの配列は配列内のGADNativeExpressAdView広告を引き起こします。

これについてのご意見はありますか?あなたのsort関数内のすべての

+1

関連性はありませんが、定数を取得するバッキングインスタンス変数を持つプロパティは、Swiftではばかげています。 'let realDate:Date、let eventName:String'と書いてイニシャライザ**を書いてください。第2の理由:配列内で2つの異なる型を組み合わせたい場合は、両方の型が適合するプロトコルを記述し、常に悪い方法である 'AnyObject'ではなく型としてプロトコルを使用します。 – vadian

+0

@vadianちょっと!私は全体のクラスを書き留めませんでしたが、初心者がいます。あなたができるなら、あなたは私に例を与えることができますか? –

+0

残念ながら、 'GADNativeExpressAdView'と' Events'がどのように関連しているかについての情報はありません。 – vadian

答えて

2

まずあなたは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.私はあなたのデータをビューと混在させるのが良い方法ではないと思います。配列のビューをきれいに保ち、データのみを保持する必要があります。

関連する問題