Swift 泛型和协议扩展

     2023-03-07     121

关键词:

【中文标题】Swift 泛型和协议扩展【英文标题】:Swift Generics and Protocol Extensions 【发布时间】:2015-09-20 19:57:01 【问题描述】:

我有一个协议Reusable,它有一个静态函数static func reuseId() -> String 和一个定义函数默认实现的协议扩展。然后,我在UITableViewCell 上实现了一个扩展,以符合Reusable 协议。我现在可以毫无问题地在 TableViewCells 上使用该函数:SomeTableViewCell.reuseId()

我遇到的问题是泛型。我有一个泛型类,它具有UITableViewCell 类型的泛型参数:

internal class SomeClass<CellType: UITableViewCell>: NSObject  
    ...

我希望能够在CellType 的泛型类中使用Reusable 中指定的函数,但不幸的是,这不能按预期工作。编译器总是生成错误Type 'CellType' has no member 'reuseId'

有人知道为什么会这样吗?有解决办法吗?

我正在使用 Xcode 7.0 和 Swift 2.0。

来自德国的问候

更新:这里有一些示例代码可以更好地显示我的问题:

import UIKit

protocol Reusable 
    static func reuseId() -> String


extension Reusable 
    static func reuseId() -> String 
        return String(self).componentsSeparatedByString(".").last!
    


extension UITableViewCell: Reusable  

class SomeGenericClass<CellType: UITableViewCell> 
    func someFunction() 
        let reuseIdentifier = CellType.reuseId()
    

此代码会产生上述错误,但我不太明白为什么会发生这种情况。我认为 jtbandes 发布的示例代码的主要区别在于我使用了静态函数。


更新:该问题在 Xcode 8.3 beta 2 中得到修复。上面的示例代码现在可以按预期工作(当然是在将其迁移到 Swift 3 之后)。

【问题讨论】:

如果您发布实际代码的(最小)示例而不是仅描述问题,将会更有帮助。 我在原始问题中添加了示例代码,希望可以让我的问题更容易理解。 【参考方案1】:

这是一个有趣的问题。您的代码似乎应该可以工作;你可能想file an enhancement request。

这是一个似乎可以正常工作的解决方法:

class SomeGenericClass<CellType: Cell> 
    func someFunction() 
        let reuseIdentifier = (CellType.self as Reusable.Type).reuseId()
    

【讨论】:

但是 CellType 继承自 UITableViewCell 已经符合 Reusable。在我看来,需要更多信息,我无法通过一个简单的示例重现该问题。 谢谢@MartinR,我想我误读了这个问题。是的,需要更多信息... 谢谢。我发布了一个雷达 22776964。您的解决方法似乎暂时可以正常工作,因此我会将您的答案标记为正确。一旦 Apple 回应雷达,我将更新问题。【参考方案2】:

获得所需内容的另一种(解决方法)方法:

class GenericExample<CellType:UITableViewCell where CellType:Reusable>     

    func test() -> String 
        return CellType.reuseId()
    


GenericExample<UITableViewCell>().test() // returns "UITableViewCell"
GenericExample<MyCell>().test() // returns "MyCell"

【讨论】:

PS 原始场景很可能是一个错误,因为 XCode 中的自动完成模型知道 CellType 有一个 resuseID() 但编译器会抱怨否则

NSManagedObjectContext 扩展中泛型函数中的奇怪 Swift 行为

】NSManagedObjectContext扩展中泛型函数中的奇怪Swift行为【英文标题】:StrangeSwiftbehavioringenericfunctioninNSManagedObjectContextextension【发布时间】:2015-07-1009:43:07【问题描述】:我目前正在使用Swift开发一个iOS项目,并且正在尝试使用Swift... 查看详情

swift使用值类型泛型和内存指针进行队列(代码片段)

查看详情

扩展类型的泛型和 Typescript 中的普通类型有啥区别?

】扩展类型的泛型和Typescript中的普通类型有啥区别?【英文标题】:WhatisthedifferencebetweenagenericthatextendsatypeandanormaltypeinTypescript?扩展类型的泛型和Typescript中的普通类型有什么区别?【发布时间】:2020-05-2317:32:00【问题描述】:Ty... 查看详情

泛型和枚举

泛型:用于解决安全问题,是一个安全机制.泛型格式;通过<>定义操作的引用数据类型。使用:当类中要操作的引用数据类型不确定的时候,早起定义Object来完成扩展,现在定义泛型类来扩展。泛型类定义的泛型,在整个类... 查看详情

swift中泛型和any类型

参考技术A除了泛型,Swift还支持Any类型,它能代表任何类型的值。从表面上看,这好像和泛型极其相似。Any类型和泛型两者都能用于定义接受两个不同类型参数的函数。然而,理解两者之间的区别至关重要:泛型可以用于定义灵... 查看详情

泛型和枚举

    泛型:        jdk1.5版本之后出现的新特性,用于解决安全问题,是一个安全机制.        泛型格式;通过<>定义操作的引用数据类型,在java提供的对象时,什么时候写泛型呢?       ... 查看详情

swift-扩展(extensions)(十八)(代码片段)

前言从这里开始的三个章节–扩展、协议、泛型,都是非常重要的知识点,并且在开发中有着举足轻重的意义。如果提前看过一些技术文章,难免看到面向泛型开发、扩展整合代码、优先使用协议+结构体的方式... 查看详情

kotlin小知识之泛型和委托(代码片段)

文章目录泛型和委托泛型的基本用法类委托和委托属性类委托委托属性实现一个自己的lazy函数泛型和委托泛型的基本用法Kotlin当中的泛型机制和Java当中的泛型机制还是有异同的所谓泛型就是说在一般的编程模式下面,我们需要给... 查看详情

符合 Swift 协议的泛型类型

】符合Swift协议的泛型类型【英文标题】:generictypeconformingtoaprotocolinSwift【发布时间】:2014-12-0901:45:24【问题描述】:是否可以要求泛型类型的特定实例化符合Swift中的协议?例如,假设我有一个名为Thing&lt;T&gt;的泛型类型... 查看详情

swift协议示例在swift中展示泛型(代码片段)

查看详情

在 Swift 中扩展泛型? [复制]

】在Swift中扩展泛型?[复制]【英文标题】:ExtendinggenericsinSwift?[duplicate]【发布时间】:2014-06-0903:13:23【问题描述】:我正在尝试在Swift中扩展Array&lt;T&gt;以添加一个调用self.append的函数。问题是Swift似乎不允许我这样做-当我... 查看详情

Swift:检查泛型类型是不是符合协议

】Swift:检查泛型类型是不是符合协议【英文标题】:Swift:checkifgenerictypeconformstoprotocolSwift:检查泛型类型是否符合协议【发布时间】:2015-01-2410:51:14【问题描述】:我有一个这样定义的协议:protocolMyProtocol...我也有一个通用结... 查看详情

Swift:不能将协议与泛型混合

】Swift:不能将协议与泛型混合【英文标题】:Swift:cannotmixprotocolswithgenerics【发布时间】:2015-03-1418:16:33【问题描述】:假设我有以下代码:protocolAstructB:Afuncb()->AreturnB()funcf<TwhereT:A>(t:T)->Treturntf(b())这会导致以下错误(Xc... 查看详情

为泛型 Swift 扩展一个类模型

】为泛型Swift扩展一个类模型【英文标题】:ExtendingaclassmodelforgenerictypeSwift【发布时间】:2019-09-2009:08:33【问题描述】:我正在使用Moya传递API响应并获取此值。我能够获取对象,但我扩展了基本响应以处理额外参数,但扩展值似... 查看详情

使用c#中的自定义数据模型实现泛型和扩展observablecollection方法(代码片段)

我的MVVM应用程序中有一个模型类MessageModel,它包含以下构造函数:publicclassMessageModel//PrivatefieldsherepublicMessageModel()publicMessageModel(MessageTypemsgType,DateTimedateTime,stringstrSource,stringstrText)this._type=msgType;this._dateTime=dateTime;this._source=strSource... 查看详情

java泛型和通配符那点事

泛型(Generictype或者generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符... 查看详情

Swift 3 扩展限制为一个类型

...在,Result再次是通用的。但是我想在我的扩展函数中保留泛型类 查看详情

swift-泛型(代码片段)

泛型和Any的区别?从表面上看两者没有区别。但是,泛型可以用于定义灵活的函数,类型检查仍然由编译器负责。而Any可以逃避开我们swift的类型系统。因此,可以的话尽量不要使用Any。​​​​​​​1.泛型代码... 查看详情