gpt4 book ai didi

swift - 在 Swift 中使用不同类型覆盖父类(super class)的可选属性

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:32 24 4
gpt4 key购买 nike

我正在寻找一种方法来覆盖具有不同类型的父类(super class)的可选属性。

如果我这样测试:

protocol protocol1
{
func testOne()
}

protocol protocol2 : protocol1
{
func testTwo()
}

class class1
{
var toto : protocol1?

init()
{

}
}

class class2 : class1
{
override var toto : protocol2?
}

let test = class2()

我在这一行中遇到错误:override var toto : protocol2?

类型为“protocol2”的属性“toto”无法覆盖类型为“protocol1”的属性

我已经用谷歌搜索过了,我找到了这个 post但它仅适用于非可选属性。

最佳答案

您链接的问题中的答案与您的想法不符。它不会更改协议(protocol)或父类(super class)中定义的属性的类型,它只是添加一个新属性。

Swift(我认为任何面向对象的语言)都不允许重新定义属性的类型,即使新类型是原始类型的子类/子协议(protocol)。我已经在我对另一个 similar question 的回答的评论部分进行了解释。 .

你能做什么?在 class 中添加一个新的计算属性,它尝试将 protocol1 向下转换为 protocol2,如果不可能则返回 nil:

class class2 : class1
{
var toto2: protocol2? {
if let toto2 = self.toto as? protocol2 {
return toto2
} else {
return nil
}
}
}

请注意,为了使向下转换工作,您必须将两个协议(protocol)都定义为 objc 兼容

@objc protocol protocol1
{
func testOne()
}

@objc protocol protocol2 : protocol1
{
func testTwo()
}

下面是我在 playground 中用来测试的代码:

@objc protocol protocol1
{
func testOne()
}

@objc protocol protocol2 : protocol1
{
func testTwo()
}

class classFromProtocol1 : protocol1 {
func testOne() {
}
}

class classFromProtocol2: protocol2 {
func testOne() {
}

func testTwo() {
}
}

class class1
{
var toto : protocol1?

init()
{

}
}

class class2 : class1
{
var toto2: protocol2? {
if let toto2 = self.toto as? protocol2 {
return toto2
} else {
return nil
}
}
}

let test = class2()
test.toto = classFromProtocol1()
test.toto // prints {classFromProtocol1}
test.toto2 // prints nil, because toto contains an instance of classFromProtocol1

test.toto = classFromProtocol2()
test.toto // prints {classFromProtocol2}
test.toto2 // prints {classFromProtocol2}

关于swift - 在 Swift 中使用不同类型覆盖父类(super class)的可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25500536/

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