Ios 如何将结构传递给需要AnyObject的方法?

Ios 如何将结构传递给需要AnyObject的方法?,ios,swift,Ios,Swift,我开始在Swift中了解Structs,并将我们应用程序的一个数据模型更改为Struct 在我们拥有的视图控制器中,我们使用以下方法: override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //Some code self.performSegueWithIdentifier("JobDetailSegue", se

我开始在Swift中了解Structs,并将我们应用程序的一个数据模型更改为Struct

在我们拥有的视图控制器中,我们使用以下方法:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        //Some code
        self.performSegueWithIdentifier("JobDetailSegue", sender: job)
    }
上面的
job
属于
JobModel
类型,这是我刚刚转换为结构的类

但是,
self行的编译失败。performsguewithidentifier(“JobDetailSegue”,发件人:job)
出现错误
无法将“JobModel”类型的值转换为预期的参数类型“AnyObject”


所以我认为接受
AnyObject?
的方法不会将结构作为参数?如果是这样,在这种情况下使用结构的正确方法是什么(如果有的话)?

在处理Cocoa或Cocoa touch API时,可以使用Swift结构。原因是,他们预计,大部分时间都是引用对象(精确地说,是指向引用对象的指针)。您可以将结构包装成一个类。但在处理Cocoa touch API时,我认为该类必须继承自
NSObject
(但我不确定这一点)

或者,您可以在
NSDictionary
的实例中公开要传递的日期,并让结构创建它

或者,您可以为每个结构添加一个类来镜像结构属性,并在与UIKit API的通信中使用类实例


也许a也能帮助你

我想也许你仍然可以使用你的
结构
,但是向它添加一个变量,返回结构中所有内容的字典格式,正如@dasdom所说,它继承自
NSObject
。所以你可以这样做:

struct JobModel {
    var someData: String!
    var someMoreData: AnyObject!
    //all of your other struct members, and then a last one which returns a dict
    var jobsDict [String: AnyObject] {
        return ["someKey": someData, "anotherKey": someMoreData]
    }
}
然后,当您执行segue时,您可以只执行以下操作,而不是传递整个作业对象:
self.performsguewithidentifier(“identifier”,发送方:job.jobsDict)
假设您的结构是

var myStruct = MyStruct()
首先使用

然后将引用传递给
myFunc

myFunc(&myStruct)

就这样。

谢谢你的回答。根据这些答案和我所做的一些研究,在这个场景中根本不可能使用结构,必须将结构转换成类对象。这些答案很好地说明了如何做到这一点


在我的场景中,我选择简单地使用带有视图控制器可以参考的
静态var的单例。此选项并不比此处建议的选项好,但对于我们正在处理的小型应用程序来说,它更快、功能更强大。

是的,您可以在Swift中使用泛型

创建一个类Trasporter

class Transporter<T> {

    var data:T!

}
类传输程序{
var数据:T!
}
现在在didSelcectRowAtIndexPath中执行了以下代码

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
       let job = Job()
       //TODO:- set job object properties hear 
       // or you can also set object from your tableview datasource array like let job = data[indexPath.row]
       let transporter = Transporter<Job>()
       transporter.data = job   
       self.performSegueWithIdentifier("JobDetailSegue", sender: transporter)

    }
override func tableView(tableView:UITableView,didSelectRowAtIndexPath:nsindepath){
让job=job()
//TODO:-设置作业对象属性
//或者也可以从tableview数据源数组中设置对象,如let job=data[indexPath.row]
let transporter=transporter()
transporter.data=作业
self.performsguewithidentifier(“JobDetailSegue”,发件人:transporter)
}
现在您可以按如下方式在prepareForSegue中接收它

// In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.

        if segue.identifier == "JobDetailSegue" {

            if let detailsVC = segue.destinationViewController as? YourDetailsViewController
            {

                if let transporter = sender as? Transporter<Job> {

                    //now you can able to access your struct using transporter object's data property 
                   //set struct in details ViewController
                    detailsVC.job = transporter.data


                }

            }

        }

    }
//在基于故事板的应用程序中,您通常需要在导航之前做一些准备
覆盖函数prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?){
//使用segue.destinationViewController获取新的视图控制器。
//将选定对象传递给新的视图控制器。
如果segue.identifier==“JobDetailSegue”{
如果让detailsVC=segue.destinationViewController作为您的detailsviewcontroller
{
如果let transporter=发送方as?transporter{
//现在,您可以使用transporter对象的数据属性访问结构
//在详细信息视图控制器中设置结构
detailsVC.job=transporter.data
}
}
}
}
  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
       let job = Job()
       //TODO:- set job object properties hear 
       // or you can also set object from your tableview datasource array like let job = data[indexPath.row]
       let transporter = Transporter<Job>()
       transporter.data = job   
       self.performSegueWithIdentifier("JobDetailSegue", sender: transporter)

    }
// In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.

        if segue.identifier == "JobDetailSegue" {

            if let detailsVC = segue.destinationViewController as? YourDetailsViewController
            {

                if let transporter = sender as? Transporter<Job> {

                    //now you can able to access your struct using transporter object's data property 
                   //set struct in details ViewController
                    detailsVC.job = transporter.data


                }

            }

        }

    }