相关疑难解决方法(0)

议定书不符合自己的要求?

为什么这个Swift代码没有编译?

protocol P { }
struct S: P { }

let arr:[P] = [ S() ]

extension Array where Element : P {
    func test<T>() -> [T] {
        return []
    }
}

let result : [S] = arr.test()
Run Code Online (Sandbox Code Playgroud)

编译器说:"类型P不符合协议P"(或者,在Swift的更高版本中,"不支持使用'P'作为符合协议'P'的具体类型.").

为什么不?不知怎的,这感觉就像语言中的漏洞.我意识到问题源于将数组声明arr协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?

generics swift swift-protocols

117
推荐指数
3
解决办法
1万
查看次数

Swift中仅限类的泛型约束

我试图将泛型类型的变量标记为弱:

class X<T> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

如果我没有提出任何约束T我得到错误weak cannot be applied to non-class type 'T'.

如果我只使用这个与NSObject派生类,这将工作:

class X<T: NSObject> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我也希望能够使用纯Swift类.

对于协议,可以通过使用class关键字要求实现者具有类类型:

protocol ClassType: class {
}
Run Code Online (Sandbox Code Playgroud)

根据ClassType协议,我现在可以将变量标记为弱:

class X<T: ClassType> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我不能class直接将关键字添加到泛型参数:

class X<T: class> { // Compile error
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:

extension NSObject: ClassType {
}
Run Code Online (Sandbox Code Playgroud)

但是对于纯Swift类,我没有可以添加此扩展的常见超类.有没有办法让这项工作没有将ClassType协议添加到我想要使用X该类的每个类?例如,泛型参数的一些特殊限定符如class X<T:ThisIsAClass> …

generics protocols class swift anyobject

21
推荐指数
1
解决办法
3801
查看次数

标签 统计

generics ×2

swift ×2

anyobject ×1

class ×1

protocols ×1

swift-protocols ×1