Swift中协议方法是否应被重写?static关键字作用答疑
关于Swift协议中static方法的两个疑问解答
嘿,看来你在学习面向协议编程时碰到了static关键字的困惑,我来帮你拆解清楚这两个问题:
1. Swift中协议方法是否应被重写?
首先要明确:协议本身只是定义了必须实现的方法签名,并没有强制要求这些方法能不能被重写——重写的可能性取决于你在遵守协议时用什么关键字实现方法,以及你的类型是值类型(结构体、枚举)还是引用类型(类)。
针对你给出的YourProtocol里的static func staticMethod() -> Float举个例子:
- 如果是值类型(比如结构体)遵守协议,你只能用
static实现这个方法,而值类型本身不支持继承,所以不存在重写的说法。 - 如果是类遵守协议,你有两种选择:
- 用
class关键字实现:这个方法可以被子类重写(需要加override关键字)。 - 用
static关键字实现:这个方法会被标记为final,子类无法重写。
- 用
看具体代码示例:
// 类用class实现协议的static方法,允许重写 class MyClass: YourProtocol { var gettableProperty: String = "Hi" var gettableSettableProperty: Int = 20 func someMethod(parameter1: Double) -> String { return "Class: \(parameter1)" } class func staticMethod() -> Float { return 2.71 } } class MySubclass: MyClass { override class func staticMethod() -> Float { return 1.41 } } // 类用static实现协议的static方法,禁止重写 class AnotherClass: YourProtocol { var gettableProperty: String = "Hey" var gettableSettableProperty: Int = 30 func someMethod(parameter1: Double) -> String { return "AnotherClass: \(parameter1)" } static func staticMethod() -> Float { return 0.0 } } // 下面的代码会直接报错,因为static方法是final的 // class AnotherSubclass: AnotherClass { // override static func staticMethod() -> Float { return 1.0 } // }
所以结论是:协议方法是否可以被重写,完全由你实现时选择的关键字和类型决定,协议本身只要求你提供符合签名的方法。
2. static关键字是否仅限制方法只能由类型调用而非实例?
当然不是!static关键字的作用不止于此,它还有几个关键特性:
- 归属类型本身:static方法属于类型,不属于任何实例,所以它无法访问实例的属性或方法(比如你在static方法里调用
self.gettableProperty会直接报错)。 - 不可重写(类中):在类里用
static声明的方法是final的,子类不能重写;而用class声明的方法则允许重写。 - 值类型的唯一性:对于结构体、枚举这些值类型,static方法是唯一的,因为值类型没有继承,所以不存在重写的场景。
举两个直观的例子:
- 无法通过实例调用static方法:
let structInstance = MyStruct() // 下面的代码会报错,static方法只能通过类型调用 // structInstance.staticMethod() // 正确的调用方式 MyStruct.staticMethod()
- static方法里不能访问实例成员:
struct MyStruct: YourProtocol { var gettableProperty: String = "Hello" var gettableSettableProperty: Int = 10 func someMethod(parameter1: Double) -> String { return "\(parameter1)" } static func staticMethod() -> Float { // 报错:Instance member 'gettableProperty' cannot be used on type 'MyStruct' // print(gettableProperty) return 3.14 } }
内容的提问来源于stack exchange,提问作者Laurence Wingo
相关产品推荐
相关产品推荐

