Swift:是否可以为UIViewController使用泛型和故事板

时间:2014-07-08 13:44:33

标签: xcode swift generics

让我们说,我有UIViewController子类:

class InformationServiceMenuVC <T : InformationServiceItemProtocol>: UITableViewController {

}

通常我可以通过调用类似的东西来创建视图控制器的实例:

let vc = InformationServiceSideMenuVC<InformationServiceMenuItem>()

如何在使用故事板时传递所需的通用类型?

2 个答案:

答案 0 :(得分:3)

创建一个继承自泛型类的具体类:

class SpecificInformationServiceMenuVC : InformationServiceMenuVC<Specific> {}

然后,您可以在故事板中使用特定子类作为类类型。

甚至可以制作一个类型:

typealias SpecificInformationServiceMenuVC = InformationServiceMenuVC<Specific>

答案 1 :(得分:1)

在Swift 3.0.1中,我能够从中重构:

<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>

<ul class="nav nav-pills">
<li class="active"><a href="#">Regular link</a></li>
<li class="dropdown">
  <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a>
  <ul class="dropdown-menu" id="menu1">
    <li>
        <a href="#">2-level Menu <i class="icon-arrow-right"></i></a>
        <ul class="dropdown-menu sub-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li class="nav-header">Nav header</li>
            <li><a href="#">Separated link</a></li>
            <li><a href="#">One more separated link</a></li>
        </ul>
    </li>
    <li><a href="#">Another action</a></li>
    <li><a href="#">Something else here</a></li>
    <li class="divider"></li>
    <li><a href="#">Separated link</a></li>
  </ul>
</li>
<li class="dropdown">
  <a href="#">Menu</a>
</li>
<li class="dropdown">
  <a href="#">Menu</a>
</li>
</ul>

为:

class TagPickerViewController: BaseViewController, HasAppController {
}
extension TagPickerViewController: UITableViewDelegate {
}

在storyboard / xib中保留class TagPickerViewControllerGeneric<TagViewModelClass: TagPickerViewModel> : BaseViewController { } class TagPickerViewController: TagPickerViewControllerGeneric<TagPickerViewModel>, HasAppController, UITableViewDelegate { } 。希望它有所帮助