加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

泛型 – 比较通用结构类型

发布时间:2020-12-14 06:01:27 所属栏目:百科 来源:网络整理
导读:如何确定通用结构的两个实例是否是相同类型? 例如,给定以下结构: struct FooBarT { let variable: T init(arg: T) { variable = arg }} 并且以下片段: let foo = FooBar(1)let bar = FooBar(1.0)let baz = FooBar("1") 我如何确定foo,bar或baz是相同或
如何确定通用结构的两个实例是否是相同类型?

例如,给定以下结构:

struct FooBar<T> {
    let variable: T
    init(arg: T) {
        variable = arg
    }
}

并且以下片段:

let foo = FooBar(1)
let bar = FooBar(1.0)
let baz = FooBar("1")

我如何确定foo,bar或baz是相同或不同类型?

func areExactType(x: FooBar) -> Bool {
    return self.dynamicType === x.dynamicType
}

这给了

Type ‘Foo’ does not conform to protocol ‘AnyObject’

func areExactType(x: FooBar) -> Bool {
    return self.dynamicType === x.dynamicType
}

这给了

Cannot invoke ‘==’ with an argument list of type ‘(Foo.Type,Foo.Type)’

func areExactType(x: FooBar) -> Bool {
    return self is x.dynamicType
}

这会产生三个错误:

Consecutive statements on a line must be separated by ‘;’

(这想要在句点和’dynamicType’之间放置一个分号)

Expected identifier in dotted type

Expected expression

编辑:

对不起,早期的答案,它实际上不工作,因为编译器将选择不同类型的函数时从另一个函数内调用:

func foobar<T,U> (lhs: Foo<T>,rhs: Foo<U>) -> Bool {
    return lhs.sameType(rhs)
}

如果你留在纯粹的斯威夫特领土,以下将工作:

给定一个简单的通用结构

struct Foo<T> {
    let v : T
}

你可以定义一个函数sameType,它接受相同类型的Foos并返回true:

func sameType<T> (a: Foo<T>,b: Foo<T>) -> Bool {
    return true
}

并用两种不同的Foos重载函数:

func sameType<T,U> (a: Foo<T>,b: Foo<U>) -> Bool {
    return false;
}

编译器将根据参数类型选择一个方法:

let a = Foo(v: 1.0)
let b = Foo(v: "asdf")
sameType(a,b) // false
sameType(a,a) // true

这与结构上的实例方法的工作方式相同:

func sameType (other: Foo) -> Bool {
        return true
    }

    func sameType<U> (other: Foo<U>) -> Bool {
        return false
    }

如果你混合Swift和Objective-C或者由于其他原因不得不依赖于动态类型,这可能会有意想不到的结果:

import Foundation
let x = NSArray(object: 1)
let y = NSArray(object: "string")
sameType(Foo(v: x[0]),Foo(v: y[0])) // true

结果是真的,因为因为Foo(v:x [0])具有类型Foo< AnyObject>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读