Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Mobile Native Express广告iOS-与[AnyObject]有关的问题_Ios_Swift_Swift3_Anyobject - Fatal编程技术网

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

Google Mobile Native Express广告iOS-与[AnyObject]有关的问题,ios,swift,swift3,anyobject,Ios,Swift,Swift3,Anyobject,我正试图在我的iOS项目中使用swift实现Native Express广告 首先我有一节课 class Events { var _eventName: String! var _realDate: Date! var realDate: Date { if _realDate == nil { _realDate = nil } return _realDate } var event

我正试图在我的iOS项目中使用swift实现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
    }

//...
}
哪个类从internet获取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())
        }

因此,ads可以附加到数组中,如我在下面的函数
addNativeExpressAds()
中所示! 我对函数
sort()
过滤器有问题

对于
sort()
它说类型为“AnyObject”的
值没有成员“realDate”

对于
filter
来说,类型为“AnyObject”的
值没有成员“eventName”

更新1。 在谷歌上做了一些研究之后,我发现这可能是
sort()
函数的解决方案

eventData.sort() { (($0 as! Events).realDate ) < ($1 as! Events).realDate }
通过这个,我得到了错误

Could not cast value of type 'GADNativeExpressAdView' (0x10046ebd8) to 'Events_Near_Me.Events' (0x10046fb90).
因此,我无法对任何对象的数组进行排序,因为数组中出现了
GADNativeExpressAdView
广告


你知道这个吗?

首先,在你的
排序功能中,你可以强制执行一个cast
事件
类型,但您的数组不仅包含
事件
对象。因此,如果强制强制强制转换,代码将失败

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
}
eventData.sort{(第一,第二)在
如果let first=first as?事件,
设秒=秒为?事件{
返回first.realDate
这是一个示例代码,我还没有测试它是否如预期的那样工作,但它应该给你一个如何继续的想法


另外,我认为将数据与视图混合使用不是一个好的做法。您应该保持数组中没有视图,并且只包含数据。

不相关,但在Swift中使用带有备份实例变量的属性来获取常量是荒谬的。只需编写
让realDate:Date,让eventName:String
并编写一个初始值设定项。第二:如果要在一个数组中组合两种不同的类型,请编写一个两种类型都符合的协议,并将该协议用作类型,而不是
AnyObject
,这通常是最糟糕的方式。@vadian嘿!虽然我没有写下整个
类,但是有一个initilizer。关于
协议
如果可以的话,你能给我举个例子吗?不幸的是,没有关于
GADNativeExpressAdView
事件
的相关信息。也许谷歌的家伙在没有利用Swift的特殊功能的情况下将他们的代码从Objective-C翻译成了Swift。奇怪的后台实例变量看起来很像google translate;-)是的,我知道。但我只是想让你看看其他的选择。其中一个()实现了瓦迪安建议的
协议。
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).
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
}