Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使Make类在静态/类级别符合协议

使Make类在静态/类级别符合协议
EN

Stack Overflow用户
提问于 2015-04-17 17:37:29
回答 2查看 2.2K关注 0票数 6

我试图在Swift中构建一个通用的UITableViewController子类,它可以容纳任意数量的不同类型的表视图单元格,而不需要了解其中的任何一个。

为此,我试图为我的模型和表视图单元使用协议。模型的协议将返回我应该去的单元类,单元的协议将返回诸如给定模型的单元格的高度等问题的答案。

但是我在使协议工作时遇到了问题,因为对于第二个协议,我想转到单元的类,而不是它的实例。

这些模型的协议如下:

代码语言:javascript
运行
AI代码解释
复制
protocol JBSTableItemDelegate
{
    func tableCellDelegate() -> JBSTableViewCellInterface
}

这些单元的协议如下:

代码语言:javascript
运行
AI代码解释
复制
protocol JBSTableViewCellInterface: class
{
    static func registerNibsWithTableView(tableView: UITableView)

    static func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath?, tableItem: JBSTableItemDelegate) -> CGFloat

    static func tableView(tableView: UITableView, dequeueReusableCellWithIndexPath indexPath: NSIndexPath, tableItem: JBSTableItemDelegate, delegate: AnyObject) -> JBSTableViewCell
}

注意关键字“静态”的用法。这些方法是UITableViewCell子类中的类方法,添加静态似乎是我需要做的工作,以验证这些类是否符合,或者我理解。

当我使用第一个协议时,代码看起来是这样的,它编译:

代码语言:javascript
运行
AI代码解释
复制
let tableViewCellInterface = tableItem!.tableViewCellInterface()

它调用此方法(例如):

代码语言:javascript
运行
AI代码解释
复制
func tableViewCellInterface() -> JBSTableViewCellInterface
{
    return JBSLiteratureTableViewCell.self as! JBSTableViewCellInterface
}

这将返回单元格的类,如"JBSLiteratureTableViewCell.self“

当我使用第二个协议时,代码看起来是这样的,而且它没有编译:

代码语言:javascript
运行
AI代码解释
复制
returnFloat = tableViewCellInterface.tableView(tableView, heightForRowAtIndexPath: indexPath, tableItem: tableItem!)

由于前面的静态关键字up,它无法编译,我得到的编译器错误是:

'JBSTableViewCellInterface‘没有一个名为'tableView’的成员

如果我将静态关键字从协议函数中删除,它会编译,但是UITableViewCell子类会抱怨说:

'JBSLiteratureTableViewCell‘不符合'JBSTableViewCellInterface’协议

这是因为他们现在正试图确保实例方法的存在,而这些方法并不在这些方法中。

如何使快速类在类级别上符合协议,以便它可以是我的委托而不是类的某些实例?我确信我可以通过创建协议JBSTableViewCellInterface的助手类来解决这个问题,这些类是单例的,并让他们来完成这项工作,但是我更愿意将其构建到类方法中的UITableViewCell子类中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-09 22:16:30

更新为Swift 2.0及以上版本的

根据Gregzo的答案,Swift 2.0+允许在协议定义中将方法声明为静态的。这些必须满足于实现协议的对象中的静态/类方法。

您不能用静态方法满足实例方法的协议定义,反之亦然,这使得上述问题的答案不完整。

如果您想尝试这一点,只需在您的协议定义中使用关键字“静态”作为方法的关键字,您将在符合条件的对象中实现为静态方法或类方法:

代码语言:javascript
运行
AI代码解释
复制
protocol InstanceVsStatic {
    func someInstanceFunc()
    static func someStaticFunc()
}

enum MyConformingEnum: InstanceVsStatic {
    case someCase

    static func someStaticFunc() {
           // code
    }
    func someInstanceFunc() {
        // code
    }
}

class MyConformingClass: InstanceVsStatic {
    class func someStaticFunc() {
           // code
    }
    func someInstanceFunc() {
        // code
    }
}

struct MyConformingStruct: InstanceVsStatic {
    static func someStaticFunc() {
           // code
    }
    func someInstanceFunc() {
        // code
    }
}

可以让一个实例方法调用一个静态/类方法:

这允许您在需要符合需要实例方法的协议时执行静态代码。

代码语言:javascript
运行
AI代码解释
复制
struct MyConformingStruct: InstanceVsStatic {
    static func doStuffStatically(){
        // code
    }

    static func someStaticFunc() {
           // code
    }

    func someInstanceFunc() {
        MyConformingStruct.doStuffStatically()
    }
}

Swift 1.2

除了上述间接的方法之外,没有办法使用静态(类)方法来遵从纯快速版本1.2及更低版本的协议。这是一个已知的错误/未实现的特性:https://openradar.appspot.com/20119848

票数 5
EN

Stack Overflow用户

发布于 2015-04-18 00:08:58

如果协议功能是静态的,则实现者应该将其实现为静态方法,如果不是,则作为实例方法实现:

代码语言:javascript
运行
AI代码解释
复制
protocol MixedProtocol
{
    static func staticFoo()
    func instanceBar()
}

class ExampleClass : MixedProtocol
{
    // implementing static func as class func is fine.
    // class funcs are overridable, not static ones
    class func staticFoo()
    {
        println( "I'm a class func" )
    }

    func instanceBar()
    {
        println( "I'm an instance func" )
    }
}

没有直接的方法可以绕过它:遵守协议就意味着这一点,而“静态”是协议成员声明的一个关键特性,实现者必须遵守。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29711935

复制
相关文章
王石:强者和弱者
职业生涯很长,对企业而言,它需要你成为一个专才,但从职业发展来看,你需要成为一个全才,方能适应社会的变化。阻碍你成为全才的不良习惯有很多,有时候我们喜欢趋利避害,拖延症更是让自己定下来的目标难以实现。
用户1756920
2018/07/20
2930
量化投资在舆论中天生就是弱者
不要因为被冤枉就义愤填膺。资本市场出了一些事情,量化投资被拿来泼脏水和顶罪,这从根上就是常态。咱们笑人家写量化的文章却压根儿不懂量化,人家笑咱们写公众号却不懂舆论和传播。
量化投资与机器学习微信公众号
2023/09/05
2090
量化投资在舆论中天生就是弱者
从零训练一个超越预训练的NLP模型
本文基于Arxiv上的一篇论文NLP From Scratch Without Large-Scale Pretraining: A Simple and Efficient Framework,清华的几位研究者提出一种任务驱动的语言模型TLM(Task-driven Language Modeling)。不需要大规模的预训练,从零训练一个大模型也能取得SOTA的效果,源码在yaoxingcheng/TLM
mathor
2021/11/17
1.3K0
从零训练一个超越预训练的NLP模型
中国软件行业迎来洗牌期强者恒强弱者出局
一年一度的中国软件百强名单再次发布,相比以往中国软件行业还是迎来前所未来的变化,互联网公司入局洗牌趋势日渐明显。
人称T客
2018/07/30
4120
中国软件行业迎来洗牌期强者恒强弱者出局
1183位求助者的数据画像:不是弱者,而是你我
截止到2月21日24时,根据国家卫健委的数据,新型冠状病毒肺炎的最新数字为累计报告确诊病例76288例,现有疑似病例5365例,死亡病例2345例。
大数据文摘
2020/02/25
4760
训练一个专门捣乱的模型
三位韩国人在EMNLP 2021 Findings上发表了一篇论文,名为Devil’s Advocate: Novel Boosting Ensemble Method from Psychological Findings for Text Classification,其中Devil's Advocate有一部同名电影,翻译过来叫「魔鬼代言人」,他们主要挑战的是传统模型融合的方法,例如硬投票(Hard-Voting)、软投票(Soft Voting)、Bagging等。源码在HwiyeolJo/DevilsAdvocate
mathor
2021/11/19
5920
训练一个专门捣乱的模型
实现一个 TicTacToe 游戏 —— 编程训练
这里我们给大家讲讲一个好玩的编程练习,很多同学想到编程练习就会觉得与算法有关。但是往往在编程的过程中,我们要实现某种逻辑或者是功能的时候,确实是需要用到算法。但是我觉得 Winter 老师说的也挺对的。
三钻
2020/11/09
1.5K0
实现一个 TicTacToe 游戏 —— 编程训练
如何训练一个词向量
现在在NLP领域,词向量是一切自然语言处理的基础,有了词向量我们就可以进行数据分析,文本聚类分类的一系列操作了。接下来我们就开始学习如何训练词向量,之前我们有介绍关于 word2vec 的博文 word2vec算法理解和数学推导,这篇博文我们就一起来学习如何实现词向量的训练。 首先我们运用的语料是我之前爬取的京东小米9的好评,训练一个关于手机类的词向量。数据如下所示:
全栈程序员站长
2022/09/05
3410
如何训练一个词向量
如何训练一个神经网络
|---------01.jpg
bye
2020/12/14
4690
快速入门PyTorch(3)--训练一个图片分类器和多 GPUs 训练
这是快速入门 PyTorch 的第三篇教程也是最后一篇教程,这次将会在 CIFAR10 数据集上简单训练一个图片分类器,将会简单实现一个分类器从网络定义、数据处理和加载到训练网络模型,最后测试模型性能的流程。以及如何使用多 GPUs 训练网络模型。
kbsc13
2019/08/16
1.2K0
一个博士生接受怎样的训练是完整、全面的科研训练?
这里,在“读研阶段”没有把硕士和博士分开。时间线是按香港政府建议硕博连读四年来订的,每格一学期。当然实际上由于北美博士是五年,因为找工作竞争力原因我们这边也经常读五年。但是规划时间上,预备出提前量也是好的。我通常也会邀请同学过来做本科论文,这样再多点提前量。
Datawhale
2021/07/30
1.1K0
BERT、GPT-2这些顶尖工具到底该怎么用到我的模型里?
近期的NLP方向,ELMO、GPT、BERT、Transformer-XL、GPT-2,各种预训练语言模型层出不穷,这些模型在各种NLP任务上一次又一次刷新上线,令人心驰神往。但是当小编翻开他们的paper,每一个上面都写着四个大字:“弱者退散”,到底该怎么将这些顶尖工具用到我的模型里呢?答案是Hugging Face的大神们开源的pytorch-pretrained-BERT。
新智元
2019/05/08
1.3K0
BERT、GPT-2这些顶尖工具到底该怎么用到我的模型里?
【深度学习】PyTorch训练一个CNN分类器
原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz
统计学家
2022/05/24
6700
【深度学习】PyTorch训练一个CNN分类器
知乎 | 一个博士生接受怎样的训练是完整的科研训练?
作者:王一 https://www.zhihu.com/question/384512106/answer/1630268431
abs_zero
2021/07/05
1.8K0
基于Pytorch构建一个可训练的BNN
一般我们在构建CNN的时候都是以32位浮点数为主,这样在网络规模很大的情况下就会占用非常大的内存资源。然后我们这里来理解一下浮点数的构成,一个float32类型的浮点数由一个符号位,8个指数位以及23个尾数为构成,即:
BBuf
2020/07/09
1.6K0
基于Pytorch构建一个可训练的BNN
怎样从零开始训练一个AI车手?
允中 发自 凹非寺 量子位 | 公众号 QbitAI △这篇文章我们做了一期b站视频,欢迎三连~ 如何快速理解强化学习的概念? 驯只猫就行。 比如下面这位爷,巨皮。 整天就是跑酷、尿炕、抓沙发,搞到人头皮发麻、心态爆炸。 直到你忍不了了,决定对它进行残酷的猫德教育。方案是: 以后在家,每当它表现出一次守猫德的行为,就奖励一根猫条; 而每当它皮一次,你就立刻扑过去,咬它的头…… 这样反复拉扯两个月之后,你的猫再也不敢皮了—— 这个过程里发生的事情,就是“强化学习”: 一个智能体(你的猫)在与环境(有
量子位
2022/09/22
2570
怎样从零开始训练一个AI车手?
YYDS!一个针对中文的预训练模型
相信做中文NLP的同学和朋友们,对哈工大和科大讯飞的发布的一系列中文预训练模型并不陌生,github项目地址为https://github.com/ymcui/。它们根据各个预训练原论文的基础上,基于中文语料,发布了诸如BERT、RoBERTa、ELECTRA、XLNet等模型,极大推动了中文NLP的发展。
NewBeeNLP
2021/08/20
2.2K0
一个小白的云开发训练营小结
一次偶然的机会,让我第一次接触到cloudbase这样一个概念。在此之前,我甚至不熟悉任何前端脚本语言。抱着试一试的心态,我参加了cloudbase云开发训练营,并在训练营开始前花时间了解了一点html与javascript的基本知识。
mikePeng
2020/08/10
3060
用Python制作一个打字训练小工具
说道程序员,你会想到什么呢?有人认为程序员象征着高薪,有人认为程序员都是死肥宅,还有人想到的则是996和 ICU。
Python编程之家
2019/09/14
8640
手把手教学!如何自己训练一个AI歌手 - so-vits-svc云端训练教程
so-vits-svc是基于VITS的开源项目,VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种结合变分推理、标准化流和对抗训练的高表现力语音合成模型。
小东_
2023/08/27
4.1K0

相似问题

弱者或无人或无

12

Pythonic方法过滤弱者列表

16

奇维与弱者比较

10

弱者到哪里去了?

10

在逻辑上等于弱者!斯威夫特

36
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档