ton*_*ran 30 protocols ios conform swift swift2
我希望我的一些课程(不是全部)能够使用docs中的"Class-Only Protocols".我在做什么
protocol RefreshData: class, ClassA, ClassB
{
func updateController()
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
non class type 'RefreshData cannot inherit from classA
non class type 'RefreshData cannot inherit from classB
Run Code Online (Sandbox Code Playgroud)
我不确定我是否完全遵循文档.有没有人对此有任何想法?
Wai*_*ain 39
Swift 4允许您组合类型,因此您可以拥有协议,然后创建一个类型别名,以将其与特定的类要求相结合.
对于(一个人为的)例子:
typealias PresentableVC = UIViewController & Presentable
Run Code Online (Sandbox Code Playgroud)
对于提供的代码:
问题是你试图限制特定的类,Swift不能这样做(目前无论如何).您只能限制类并从其他协议继承.您的语法是用于协议继承,但您尝试将其用作类限制.
请注意,类协议的目的是:
当该协议的要求定义的行为假定或要求符合类型具有引用语义而不是值语义时,请使用仅类协议.
Luc*_*tti 22
Chris和Wain提供的答案是正确的.我只是在这里添加一些细节.
你必须区分声明a protocol
(可用于类)的概念
protocol RefreshData: class {
func updateController()
}
Run Code Online (Sandbox Code Playgroud)
......从符合你的班级到协议的概念
class ClassA: RefreshData {
func updateController() {
}
}
Run Code Online (Sandbox Code Playgroud)
有时您希望将类与协议相符,但您不拥有该类的源代码.在这种情况下,您可以使用extension
extension ClassB: RefreshData {
func updateController() {
}
}
Run Code Online (Sandbox Code Playgroud)
最新版本的Swift可以做到!我会做一个针对你想要的类的协议和协议扩展!(约束特定类的扩展)
protocol Movable {
func moveForward()
func moveBackward()
}
extension Movable where Self: Car {
func moveForward() {
self.location.x += 10;
}
func moveBackward() {
self.location.x -= 10;
}
}
extension Movable where Self: Bike {
func moveForward() {
self.x += 1;
}
func moveBackward() {
self.x -= 1;
}
}
class Car: Movable {
var location: CGPoint
init(atLocation location: CGPoint) {
self.location = location
}
}
class Bike: Movable {
var x: Int
init(atX x: Int) {
self.x = x
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23127 次 |
最近记录: |