Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
协议方法是否意味着在Swift中被覆盖?_Swift_Protocols_Static Methods - Fatal编程技术网

协议方法是否意味着在Swift中被覆盖?

协议方法是否意味着在Swift中被覆盖?,swift,protocols,static-methods,Swift,Protocols,Static Methods,我已经开始阅读一本关于Swift中面向协议编程的教科书。当我在操场上写代码时,我注意到书中的一个方法使用了关键字“static”。据我所知,静态方法意味着该方法由类型本身调用,而不是由类型的特定实例调用。我的理解是,静态方法不能被重写 由于协议在声明时只是方法签名,我认为使用关键字“static”有点奇怪,因为我们必须在遵守协议时实现函数的存根 从抽象的角度开始思考,我想知道协议方法是要在Swift中重写,还是使用关键字“static”只会使它变成只有类型本身才能调用方法,而不是它的实例调用方法

我已经开始阅读一本关于Swift中面向协议编程的教科书。当我在操场上写代码时,我注意到书中的一个方法使用了关键字“static”。据我所知,静态方法意味着该方法由类型本身调用,而不是由类型的特定实例调用。我的理解是,静态方法不能被重写

由于协议在声明时只是方法签名,我认为使用关键字“static”有点奇怪,因为我们必须在遵守协议时实现函数的存根

从抽象的角度开始思考,我想知道协议方法是要在Swift中重写,还是使用关键字“static”只会使它变成只有类型本身才能调用方法,而不是它的实例调用方法

protocol YourProtocol {

    //property requirements that types that conform to this protocl MUST implement
    var gettableProperty: String { get }
    var gettableSettableProperty: Int { get set }

    //method requirements that types that conform to this protocol MUST implement
    func someMethod(parameter1: Double) -> String


    static func staticMethod() -> Float 

}

您是对的,不能重写
静态
方法,因为它们总是绑定到一个特定的类型,但是,协议中的
静态
方法声明可以使用
方法实现。和
class
方法可以被覆盖:

protocol YourProtocol {
    static func staticMethod() -> Float
}

class A: YourProtocol {
    class func staticMethod() -> Float {
        return 1.0
    }
}

class B: A {
    override class func staticMethod() -> Float {
        return 2.0
    }
}
而且,被覆盖的能力不是核心点。我认为在
静态
常量或
静态
变量getter上可以更好地理解这个概念,以静态库中的一个示例为例:

public protocol FloatingPoint: ... {
   public static var pi: Self { get }
}
该协议由所有浮点类型实现,例如
Double
Float
,它们不是偶数类,因此不支持继承和重写。在声明将此协议用作类型约束的泛型方法时,可以使用协议中声明的静态常量这一事实:

func toDegrees<T: FloatingPoint>(radians: T) -> T {
    // the .pi here is a static var getter
    return radians * 180 / T.pi
}
func-toDegrees(弧度:T)->T{
//这里的.pi是一个静态变量getter
返回弧度*180/T.pi
}

您是对的,不能重写
静态
方法,因为它们总是绑定到一个特定类型,但是,协议中的
静态
方法声明可以使用
方法来实现。和
class
方法可以被覆盖:

protocol YourProtocol {
    static func staticMethod() -> Float
}

class A: YourProtocol {
    class func staticMethod() -> Float {
        return 1.0
    }
}

class B: A {
    override class func staticMethod() -> Float {
        return 2.0
    }
}
而且,被覆盖的能力不是核心点。我认为在
静态
常量或
静态
变量getter上可以更好地理解这个概念,以静态库中的一个示例为例:

public protocol FloatingPoint: ... {
   public static var pi: Self { get }
}
该协议由所有浮点类型实现,例如
Double
Float
,它们不是偶数类,因此不支持继承和重写。在声明将此协议用作类型约束的泛型方法时,可以使用协议中声明的静态常量这一事实:

func toDegrees<T: FloatingPoint>(radians: T) -> T {
    // the .pi here is a static var getter
    return radians * 180 / T.pi
}
func-toDegrees(弧度:T)->T{
//这里的.pi是一个静态变量getter
返回弧度*180/T.pi
}

我遵循了上一个关于静态常量的示例,但是“作为约束”一词让我有点困惑。我真的很想理解它,所以我必须继续阅读,除非你能澄清你所说的“作为约束”是什么意思?@CosmicArrows我现在添加了一个例子,我遵循了你关于静态常数的最后一个例子,但是我对“作为约束”这个词有点困惑。我真的很想理解它,所以我必须继续阅读,除非你能澄清你所说的“作为约束”是什么意思?@CosmicArrows我现在添加了一个例子