我有一个通用结构。我在扩展中的结构中添加了一个方法,如下所示-
struct CustomStruct<T> {
let data: T?
}
extension CustomStruct {
func method1() {
}
}
当类型为T
is String
,我想要method1
来执行不同的动作。
我尝试添加另一个带有泛型类型约束的扩展,如下所示-
extension CustomStruct where T == String {
func method1() {
print("method1 for string called")
}
}
但是,执行以下代码时不会调用上述方法。
let struct1 = CustomStruct<String>(data: "something")
struct1.method1()
谁能指出如何解决这个问题?
编辑-上面的代码没有指出我遇到的问题,正如@scriptable和@matt所指出的。下面的代码指出了我遇到的问题
struct CustomStruct<T> {
let data: T?
}
extension CustomStruct {
func method1() {
print("method1 for all type called")
}
}
extension CustomStruct where T == String {
func method1() {
print("method1 for string called")
}
}
func callMethod1<T>(customStruct: CustomStruct<T>) {
customStruct.method1()
}
let struct1 = CustomStruct<String>(data: "something")
callMethod1(customStruct: struct1)
无法从您提供的示例中重现该问题。我假设您遇到了一个更复杂的问题,您试图将其归结为这个问题,但您错误地将其归结为问题。我猜你实际看到的是这样的:
struct CustomStruct<T> {
let data: T?
func method1() {
print("original method1")
}
func method2() {
method1()
}
}
extension CustomStruct where T == String {
func method1() {
print("method1 for string called")
}
}
let struct1 = CustomStruct(data: "something")
struct1.method1() // method1 for string called
struct1.method2() // original method1
正如你所看到的,如果我们调用method1
我们自己直接通过扩展。 (这就是为什么无法从您给出的示例中重现该问题的原因。)但是如果我们调用method2
,这称为method1
,我们得到原来的method1
,不属于扩展名。
这是真正的问题吗?
如果是这样,您可能遇到了一个常见的误解,即您试图使用where
子句来启用某种基于类型的调度。这是错误的,而且不是什么where
子句是为了.正如乔丹·罗斯所说here https://bugs.swift.org/browse/SR-10549:
在 Swift 中,被调用的函数是在调用的地方选择的。
获得基于类型的调度(正如他继续说的)的方法是通过标准方法,例如重写(多态性)和重载(不同的方法签名)。或者您当然可以自己检查类型并实时做出决定。
换句话说:您不能使用扩展来执行方法重写。但这正是您正在尝试做的事情。您不能使用 where 子句将结构转换为类(动态调度),或执行重载工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)