小编Ste*_*ton的帖子

Swift Generics:使用T.Type作为参数的函数返回可选的T.

我正在尝试编写一系列泛型函数,它们将通过传递UIViewController类或子类Type 对视图控制器堆栈进行排序,然后返回"找到"viewController或nil的实例.到目前为止,我甚至无法编译这个简单的代码片段:

extension UINavigationController {

    func fhk_find<T: UIViewController>(viewControllerType: T.Type) -> T?
    {
        if let viewController = viewControllers.first as? viewControllerType {
            return viewController
        }
        else {
            return nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并会打电话给:

navController.fhk_find(fooViewController.self)
Run Code Online (Sandbox Code Playgroud)

但是,编译器告诉我这viewControllerType不是一个类型.

我不确定我在这里缺少什么......

generics ios swift

6
推荐指数
1
解决办法
714
查看次数

Swift 2.2 中 init 的使用不明确

使用 Xcode 7.3 和 Swift 2.2 构建时遇到“init 的使用不明确”错误

该问题与两个 Objective-C 类以及 Swift 如何查看它们的初始值设定项有关。

Objc 看到:

超类

@interface Foo: NSManagedObject
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)

子类

@interface Bar: Foo
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)

而 Swift 只能看到:

init(owner: Owner!, insertIntoManagedObjectContext context: NSManagedObjectContext!)
Run Code Online (Sandbox Code Playgroud)

这导致编译器不确定在子类“Bar”上调用哪个 init。有没有办法指定在初始化子类时使用哪个初始化器?如果可能的话,我想避免重构 init 方法。

objective-c ios swift

4
推荐指数
1
解决办法
1502
查看次数

标签 统计

ios ×2

swift ×2

generics ×1

objective-c ×1