如何从协议 convert/cast 到 swift 中的 class?
How to convert/cast from a protocol to a class in swift?
很简单,我原以为;我只想检查一个变量是否是 class 并在可能的情况下将其转换为一个
例如:
var cellProtocol:MyTableViewCellProtocol? = nil
cellProtocol = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as MyTableViewCell
如何将单元格显式转换为 UITableViewCell?
继承如下:
class MyTableViewCell: UITableViewCell, MyTableViewCellProtocol {
//....
}
@objc protocol MyTableViewCellProtocol: class, NSObjectProtocol {
func configureCell()
}
那个协议定义是我试图解决这个问题的结果。我原来的那个没有@objc
标签,也没有 class
-only 标识符。
我尝试了一些方法来实现转换,但没有奏效:
var cellToReturn = cellProtocol as UITableViewCell
这不会编译,因为 UITableViewCell
没有显式继承自 MyTableViewCellProtocol
。
var cellToReturn = cellProtocol as AnyObject as UITableViewCell
这在运行时失败,因为 cellProtocol
无法转换为 AnyObject
。
我还没有能够让 unsafeBitCast
工作,但这是我一直在探索的另一种可能性。
请注意,这在 Obj-C 中确实有效。
id<MyTableViewCellProtocol> cellProtocol = cell;
[cellProtocol configureCell];
UITableViewCell *cellCast = (UITableViewCell *)cellProtocol;
这没有给我任何错误并且运行良好。
如果您希望它只是一个 MyTableViewCellProtocol
,您应该在 as
子句中使用它。如果你想要条件转换,使用 if let
.
if let cellProtocol = <dequeue> as? MyTableViewCellProtocol {
// You're an object that conforms to MyTableViewCellProtocol.
if let mycell = cellProtocol as? MyTableViewCell {
// You're a MyTableViewCell object
if let cell = cell as? UITableViewCell {
// You're a UITableViewCell object
}
}
}
请记住,您只能检查指定为 @objc
的协议的协议一致性(但您已经这样做了)。
使用 Swift 1.2 / Xcode 6.3 Beta,编译:
var cellToReturn = cellProtocol as! UITableViewCell
从 Swift 1.1 开始,您必须将其转换为 AnyObject
或 Any
,然后是 UITableViewCell
。我认为这是一种错误。
var cellToReturn = cellProtocol as AnyObject as UITableViewCell
ADDED:原来是Optional
的问题
在这种情况下,cellProtocol
是 MyTableViewCellProtocol?
。你必须先解开它,然后再投射。
尝试:
var cellToReturn = cellProtocol! as AnyObject as UITableViewCell
// ^
很简单,我原以为;我只想检查一个变量是否是 class 并在可能的情况下将其转换为一个
例如:
var cellProtocol:MyTableViewCellProtocol? = nil
cellProtocol = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as MyTableViewCell
如何将单元格显式转换为 UITableViewCell?
继承如下:
class MyTableViewCell: UITableViewCell, MyTableViewCellProtocol {
//....
}
@objc protocol MyTableViewCellProtocol: class, NSObjectProtocol {
func configureCell()
}
那个协议定义是我试图解决这个问题的结果。我原来的那个没有@objc
标签,也没有 class
-only 标识符。
我尝试了一些方法来实现转换,但没有奏效:
var cellToReturn = cellProtocol as UITableViewCell
这不会编译,因为 UITableViewCell
没有显式继承自 MyTableViewCellProtocol
。
var cellToReturn = cellProtocol as AnyObject as UITableViewCell
这在运行时失败,因为 cellProtocol
无法转换为 AnyObject
。
我还没有能够让 unsafeBitCast
工作,但这是我一直在探索的另一种可能性。
请注意,这在 Obj-C 中确实有效。
id<MyTableViewCellProtocol> cellProtocol = cell;
[cellProtocol configureCell];
UITableViewCell *cellCast = (UITableViewCell *)cellProtocol;
这没有给我任何错误并且运行良好。
如果您希望它只是一个 MyTableViewCellProtocol
,您应该在 as
子句中使用它。如果你想要条件转换,使用 if let
.
if let cellProtocol = <dequeue> as? MyTableViewCellProtocol {
// You're an object that conforms to MyTableViewCellProtocol.
if let mycell = cellProtocol as? MyTableViewCell {
// You're a MyTableViewCell object
if let cell = cell as? UITableViewCell {
// You're a UITableViewCell object
}
}
}
请记住,您只能检查指定为 @objc
的协议的协议一致性(但您已经这样做了)。
使用 Swift 1.2 / Xcode 6.3 Beta,编译:
var cellToReturn = cellProtocol as! UITableViewCell
从 Swift 1.1 开始,您必须将其转换为 AnyObject
或 Any
,然后是 UITableViewCell
。我认为这是一种错误。
var cellToReturn = cellProtocol as AnyObject as UITableViewCell
ADDED:原来是Optional
在这种情况下,cellProtocol
是 MyTableViewCellProtocol?
。你必须先解开它,然后再投射。
尝试:
var cellToReturn = cellProtocol! as AnyObject as UITableViewCell
// ^