在泛型swift函数中进行类型转换

在泛型swift函数中进行类型转换,swift,generics,Swift,Generics,假设我有一个UICollectionViewCell和一个具有相同属性的UITableViewCell。我不需要两个函数来填充这些单元格,我是否可以使用一个泛型来获取某个内容,确定该内容,然后将其转换为正确的内容,以便在返回之前对其执行操作 我的想法是: func setUpCell<T>(event: Event, cell:T) -> T { // figure out what T is and cast it cell.event.bar = even

假设我有一个UICollectionViewCell和一个具有相同属性的UITableViewCell。我不需要两个函数来填充这些单元格,我是否可以使用一个泛型来获取某个内容,确定该内容,然后将其转换为正确的内容,以便在返回之前对其执行操作

我的想法是:

func setUpCell<T>(event: Event, cell:T) -> T {

    // figure out what T is and cast it
    cell.event.bar = event.bar
    return cell

}
func设置单元格(事件:事件,单元格:T)->T{
//找出T是什么,然后将其转换
cell.event.bar=event.bar
返回单元
}
这是避免大量代码重复的好方法吗?

给定您的型号

struct Event {
    let title: String
    let desc: String
}
定义此协议

protocol EventCell: class {
    var id: String? { get set }
    var desc: String? { get set }
}
现在将
UITabelViewCell
UICollectionViewCell
与之一致

class TableCell: UITableViewController, EventCell {
    var id: String?
    var desc: String?
}

class CollectionCell: UICollectionViewCell, EventCell {
    var id: String?
    var desc: String?
}
最后定义这个扩展

extension EventCell {
    func populate(event:Event) {
        self.id = event.id
        self.desc = event.desc
    }
}

就这样。现在,您的两个单元格(
UITabelViewCell
UICollectionViewCell
)都有了
populate
方法

这符合你的想法吗

import UIKit

struct Event {
  var bar:Int = 0
}

// Protocol to group common additions
protocol ViewCellAdditions {
  init()
  var separatorInset:Int { get set }
  var event:Event { get set}
}

// Generic function to work on any class that adopts ViewCellAdditions
func setUpCell<T: ViewCellAdditions>(event: Event, cell:T, foo:Int) -> T {
  var newCell = T()
  newCell.separatorInset = foo
  newCell.event.bar = event.bar
  return newCell
}

// Class that adopts ViewCellAdditions
class NewCellClass: ViewCellAdditions {
  required init() {}
  var separatorInset:Int = 10
  var event:Event = Event()
}

// How to use it
let aCell = NewCellClass()
let aEvent = Event()
let newCell = setUpCell(aEvent, cell: aCell, foo: 5)
导入UIKit
结构事件{
变量栏:Int=0
}
//分组公共添加的协议
协议视图单元添加{
init()
var separatorInset:Int{get set}
var事件:事件{get set}
}
//用于处理任何采用ViewCellAdditions的类的泛型函数
func setUpCell(事件:事件,单元格:T,foo:Int)->T{
var newCell=T()
newCell.separatorInset=foo
newCell.event.bar=event.bar
返回新单元格
}
//采用ViewCellAdditions的类
类NewCellClass:ViewCellAdditions{
必需的init(){}
变量分隔符设置:Int=10
var-event:event=event()
}
//如何使用它
设aCell=NewCellClass()
设aEvent=Event()
让newCell=setUpCell(aEvent,cell:aCell,foo:5)

需要更多信息,什么是foo类?您在哪里定义了属性
单独设置
事件
?您需要扩展示例。什么是
foo
?如果你想在两种不同的类型上执行相同的操作,它们必须共享一些接口,例如采用相同的协议,成为相同超类的子类等等。foo什么都不是,只是一个例子,我有一个UITableViewCell和UICollectionViewCell子类,它们具有相同的属性,需要以相同的方式进行设置。我可以编写两个单独的函数,但我认为泛型可能是另一种实现itSo协议的方法,也许会研究如何实现它这似乎很好我想试试这个,在填充视图的单元格上有几个函数,因此EVentCell无法访问视图。这些操作需要保留在各自的类上。我假设这看起来也不错,假设我想在ViewCellAdditions上设置一个名为displayView()的函数,该函数需要访问单元格视图,我假设我仍然可以从setUpCell调用它,因为
UIView
是一个类,而不是一个属性。相反,您要做的是扩展
UIView
以符合属性,或者让您的新类继承自
UIView
和新属性。后者可能是最好的。