Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vapor 4:创建包含Fluent ParentProperty的协议会导致编译器错误

Vapor 4:创建包含Fluent ParentProperty的协议会导致编译器错误
EN

Stack Overflow用户
提问于 2021-08-23 10:31:32
回答 1查看 37关注 0票数 1

我有一大堆Fluent (Vapor 4)模型,它们都有一个父字段,如下所示:

代码语言:javascript
运行
AI代码解释
复制
final class Location: Model, Content {
  // .. bunch of other properties

  @Parent(key: FieldKeys.campaign)
  var campaign: Campaign
}

现在,我想做一个可以应用于所有这些模型的协议,就像这样:

代码语言:javascript
运行
AI代码解释
复制
protocol HasCampaignId: Model {
  var _campaign: ParentProperty<Self, Campaign> { get }
  func belongsToCampaign(_ campaignID: Campaign.IDValue) throws -> Self
}

extension HasCampaignId {
  func belongsToCampaign(_ campaignID: Campaign.IDValue) throws -> Self {
    if self._campaign.id != campaignID {
      throw Abort(.forbidden)
    }

    return self
  }
}

这只是一个方便的小函数,我可以应用于HasCampaignId模型的任何实例,这就是我的想法。遗憾的是,这不能编译,我得到了错误Property '_campaign' must be declared internal because it matches a requirement in internal protocol 'HasCampaignId'。我可以将协议设置为公共的,但是我得到了另一个错误:Property '_campaign' must be as accessible as its enclosing type because it matches a requirement in protocol 'HasCampaignId'

我可以像这样修改协议:

代码语言:javascript
运行
AI代码解释
复制
protocol HasCampaignId: Model {
  var campaign: Campaign { get }
  func belongsToCampaign(_ campaignID: Campaign.IDValue) throws -> Self
}

extension HasCampaignId {
  func belongsToCampaign(_ campaignID: Campaign.IDValue) throws -> Self {
    if self.campaign.id != campaignID {
      throw Abort(.forbidden)
    }

    return self
  }
}

但这需要我加载campaign关系,这通常不是我想要的-否则它会崩溃并出现致命错误:Fatal error: Parent relation not eager loaded, use $ prefix to access: Parent<Loot, Campaign>(key: campaign_id)

我的协议中的campaign属性也不能应用属性包装。

那么,如何才能有一个需要ParentProperty字段的协议呢?如何解决编译器错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-24 03:27:47

从Swift 5.4和5.5开始--你不能。协议中的属性包装器已经被提出,但它们没有实现,而且不可能强制执行。为了流利地绕过这些限制,我们付出了很多努力,但目前还不可能做到你想要做的事情。

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

https://stackoverflow.com/questions/68897430

复制
相关文章
Vapor奇幻之旅(05 Fluent)
在上一篇Vapor奇幻之旅(04Routing)中我介绍了Routing的写法,作为一个web应用,数据库是必不可少的,而Fluent则是管理数据的一个抽象层,可以支持数据库的增删改查等操作,默认的FluentProvider支持sqlite数据库,也就是说在没有任何数据库配置的情况下,可以通过Fluent Provider中的内存数据库来快速加载SQLite数据库,这样做的好处是可以轻松的进行接口测试。
Leacode
2018/08/22
1.2K0
Vapor奇幻之旅(05 Fluent)
Vapor3初探——使用Fluent查询数据
Vapor升级到Vapor3的时间恰巧赶上WWDC,本来想从美国回来就开始写一些关于Vapor3的文章,但是WWDC信息量太大了,直到现在才转过来写一点关于Vapor的东西。
Leacode
2018/08/22
7230
Vapor奇幻之旅(06 PostgreSQL)
用Vapor连接数据库是一件令人兴奋的事,本篇就来介绍如何使用Vapor来连接PostgreSQL数据库,将数据持久化。
Leacode
2018/08/22
1.3K0
Vapor奇幻之旅(06 PostgreSQL)
使用Vapor 3 创建项目build/xocde 报错
以前跟着网上的教程玩过Vapor2,但基本都忘光了,今天下班了有照着官方文档来一波。。。但是出错了。。。
韦弦zhy
2018/09/11
5050
Vapor奇幻之旅(03上手)
在Vapor奇幻之旅(02部署)一篇中,我介绍了如何在ubuntu上部署并运行vapor项目,这篇文章我来讲讲怎么样来上手开发Vapor项目。
Leacode
2018/08/22
9470
Vapor奇幻之旅(03上手)
swift vapor 简易在线日志统计
static var leftIDKey: WritableKeyPath<LOUserDevicePivot, Int> = \.userId
大话swift
2019/07/04
7640
swift vapor 简易在线日志统计
Vapor奇幻之旅(08 连接服务端MongoDB)
首先付上官网的安装教程:安装mongodb,这个是社区版,由于企业版是收费的,就先来个社区版以供测试使用。
Leacode
2018/08/22
1K0
Vapor奇幻之旅(08 连接服务端MongoDB)
[WPF 自定义控件]创建包含CheckBox的ListBoxItem
不过它用起来不怎么样,与其这样还不如参考UWP的ListView实现,而且动画效果也很好看:
dino.c
2020/02/21
3.1K0
[WPF 自定义控件]创建包含CheckBox的ListBoxItem
Vapor奇幻之旅(01开始)
Swift开源以来就有了许多服务器的框架,以下是目前github上比较热门的服务器框架(页面收集来自awesome-swift),我对每个开源库按照star进行了排序:
Leacode
2018/08/22
1.1K0
Vapor奇幻之旅(01开始)
Vapor奇幻之旅(09 连接MySQL)
这一篇文章主要介绍如何在Vapor项目中连接mysql数据库。MySQL相信是大家最常用的数据库之一了,几乎每个公司都有用到这个数据库,如果你对于数据库的选择相对保守,那么mysql是个不错的选择。
Leacode
2018/08/22
1.7K0
Vapor奇幻之旅(09 连接MySQL)
Vapor奇幻之旅(07 连接服务端PostgreSQL)
在配置ubuntu16.4服务器上的postgresql数据库时遇到了很多问题,网上查了很多资料,都没有太深的理解。于是我先查看了官方文档,先搞清楚这些配置是做什么的,再根据需要配置自己的服务器,这样就可以清楚的知道自己在做什么了,下面讲讲这些配置是怎样的。
Leacode
2018/08/22
1.3K0
Vapor奇幻之旅(07 连接服务端PostgreSQL)
DedeCMS未过滤文件包含函数导致任意文件包含漏洞
最近DedeCMS又被爆出存在文件包含漏洞。据了解,该漏洞影响版本为5.7.106以及之前的版本。影响范围较大,其中,文件uploads/dede/article_allowurl_edit.php存在缺乏对写入内容的安全过滤,导致可以写入任意内容,形成了该漏洞,具体漏洞详情如下:
技术分享达人
2023/05/31
1.1K0
porm导致项目运行错误
由于创建moduel基于原来项目之上导致porm会继承原有项目导致运行错误 解决:删除继承关系 relative
全栈程序员站长
2022/07/02
9220
porm导致项目运行错误
Python 异步: 协程(4)
Python 提供一流的协程,具有“coroutine”类型和新的表达式,如“async def”和“await”。它提供了用于运行协程和开发异步程序的“asyncio”模块。
数据科学工厂
2023/01/28
8660
Vapor奇幻之旅(04Routing)
Vapor的Routing提供了RouteBuilder和RouteCollection
Leacode
2018/08/22
7040
Vapor奇幻之旅(04Routing)
vapor Web Authentication
最近写东西一直没有加Authorware,也一直知道这个功能很重要,但是一直没有下定决心去看这一块,其实是有原因的:1 一开始粗略的看了一下,似是而非,于是感觉这个东东很难,很晦涩 2 由于之前看Laravel遗留的这一部分没看,感觉很难 。哈哈总之一句话:下意识的感觉这部分很难,所以它难…… 下意识中感觉他很难,但是理智还是要上的--理智告诉我这部分要去实践,去克服……
大话swift
2019/07/03
5620
vapor Web Authentication
Vapor奇幻之旅(02部署)
在Vapor奇幻之旅(01开篇) 中我介绍了如何用swift来构建web应用,这篇文章我会介绍如何在ubuntu服务器上部署vapor项目。
Leacode
2018/08/22
1.3K0
Vapor奇幻之旅(02部署)
Python 异步: 协程(4)
Python 提供一流的协程,具有“coroutine”类型和新的表达式,如“async def”和“await”。它提供了用于运行协程和开发异步程序的“asyncio”模块。
数据科学工厂
2023/02/27
6650
Python 异步: 协程(4)
vapor smtp发送邮件provider
最经几天一直在拜读Vapor中service的源码,连续几天上班途中和下班之后都是在翻看源码,从刚开始感觉云山雾绕到逐渐清晰
大话swift
2019/07/04
1.1K0
vapor smtp发送邮件provider
点击加载更多

相似问题

使用Vapor 4/Fluent进行交易

114

创建干净的Vapor项目(使用fluent)会导致MongoKitten运行时错误

13

Vapor 4中协议的通用fluent查询

212

删除Vapor Fluent轴

15

部署init vapor 4项目导致错误

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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