gpt4 book ai didi

ios - Swift:自类型、子类化和重写方法

转载 作者:可可西里 更新时间:2023-10-31 23:44:48 25 4
gpt4 key购买 nike

以下代码显示了类 A,它是类 B 的父类(super class)。该函数的返回类型为“Self”。 B 类中的重写方法会出错(请参阅评论)。

class A {
class func doSomething(param1: String) -> Self {
var entity = self()

// Some code goes here...

return entity
}
}

class B: A {
override class func doSomething(param1: String) -> Self {
var entity = super.doSomething(param1) as! B

// Some code goes here...

return entity // Error:'B' is not convertible to 'Self'
}
}

如果我在 Objective-C 中使用 instanceType,它就可以工作。那么我怎样才能让它工作呢?或者那是不可能的?

我想让方法成为当前重写类的返回类型。解决方法是使用一个接受父类(super class)类型作为参数的初始化方法。


这带来了另一个问题:强制转换为当前类的对象不等于 self()?

那有什么区别

var entity = someObject as! B

var entity = self() // Current class / file is B

编辑:

class func objectCast<T: A>(obj: A) -> T {
return obj as! T
}

返回 objectCast(entity) 而不是实体有效。

class A {
class func doSomething(param1: String) -> Self {
var entity = self()

// Some code goes here...

return entity
}
}

class B: A {
override class func doSomething(param1: String) -> Self {
var entity = super.doSomething(param1) as! B

// Some code goes here...

return objectCast(entity) // No error.
}
}

所以……为什么需要那个把戏,看来我对“ self ”的含义理解有问题。谁能回答我关于差异的问题的第二部分?

最佳答案

关于你的第二个问题,不同之处在于第一个选项将在任何子类中返回 B,因此子类不会返回 Self,而第二个选项将在任何子类中返回一个 Self 实体。如果您将 B 类标记为最终类,则这两种方法都有效。

关于ios - Swift:自类型、子类化和重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com