首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么LocalizedStringKey的行为取决于我是否将字符串内插传递给它的初始化项?

为什么LocalizedStringKey的行为取决于我是否将字符串内插传递给它的初始化项?
EN

Stack Overflow用户
提问于 2022-09-16 02:48:09
回答 1查看 91关注 0票数 3

当我试图回答这个问题时,我发现了一种奇怪的行为。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text(LocalizedStringKey("Hello \(Image(systemName: "globe"))"))

显示一个地球仪,但是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text(LocalizedStringKey("Hello {world}".replacingOccurrences(of: "{world}", with: "\(Image(systemName: "globe"))")))
Text(LocalizedStringKey("Hello" + "\(Image(systemName: "globe"))"))

显示"Hello“,后面是SwiftUI的内部术语混乱。

一个更小的例子是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x = "\(Image(systemName: "globe"))"
print(LocalizedStringKey.init(x))
print(LocalizedStringKey.init("\(Image(systemName: "globe"))"))

我传递给LocalizedStringKey.init的值应该是相同的,都是"\(Image(systemName: "globe"))",但是第一次打印

LocalizedStringKey(key: "%@", hasFormatting: true, arguments: [...])

第二批指纹

LocalizedStringKey(key: "Image(provider: SwiftUI.ImageProviderBox<SwiftUI.Image.(unknown context at $7ff91ccb3380).NamedImageProvider>)", hasFormatting: false, arguments: [])

LocalizedStringKey.init 似乎改变了它的行为,这取决于我传递的参数是否为(内插的)字符串文字。

据我所见,对LocalizedStringKey.init的两个调用正在调用相同的初始化项。在一个参数-无标签初始化器中只有LocalizedStringKey,它需要一个String

如果还有一个接受LocalizedStringKey的初始化器,那么结果就会更容易理解。毕竟,LocalizedStringKey 有自定义字符串插补规则Image。但据我所知,这是唯一没有参数标签的初始化器。

如果初始化程序的参数是@autoclosure () -> String,这也是可以理解的。如果我传入的表达式是惰性计算的,则该方法可能能够以一些我所不知道的方式“窥视”闭包。但是参数不是自动闭包。

这里所发生的事情似乎是编译器正在创建一个LocalizedStringKey,其中key与您传入的插值模式相同,尽管参数是一个String

这到底是怎么回事?我是不是错过了一个隐藏的首字母?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-16 03:57:35

TL;博士:你所看到的行为来自于ExpressibleByStringInterpolation。但是为了更多的乐趣继续读吧!

如果您认为LocalizedStringKey纯粹是一种方便,可以让SwiftUI接口元素在使用字符串文本时“免费”本地化,那么它就更容易理解。只有一次你会直接使用它。

考虑一下Text。有两个相关的初始化器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)

它将尝试本地化传入的文本,以及

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init<S>(_ content: S) where S : StringProtocol

它将显示字符串而不改变它。

如果您调用Text("Hello"),则使用哪个初始化程序?

字符串文字符合StringProtocol,但LocalizedStringKey也是ExpressibleByStringLiteral。编译器不知道要选择哪一个。

为了获得“免费”的本地化,StringProtocol初始化器被标记为@_disfavoredOverload,这告诉编译器假定字符串文本是LocalizableStringKey而不是String

因此,Text("Hello")Text(LocalizedStringKey("Hello"))是等价的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let string = "Hello"
Text(string)

在这种情况下,没有冲突-编译器使用StringProtocol初始化程序,并且字符串没有本地化。

这和你的问题有什么关系?LocalizedStringKey也是ExpressibleByStringInterpolation,这就是你的“隐藏初始化器”的来源。但是就像上面的例子一样,只有当你用一个插入的字符串初始化它时,这才会起作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text("Hello \(Image(systemName: "globe"))")

您正在传递一个内插字符串,因此编译器可以处理它并将图像添加到插值中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text("Hello {world}".replacingOccurrences(of: "{world}", with: "\(Image(systemName: "globe"))"))

在这里,首先对replacingOccurrences(of:进行计算,这意味着您的参数是一个String,它不被视为通过字符串插值表示的LocalizedStringKey。你基本上看到了图像的描述。

+的示例也会发生类似的情况。这就隐式地形成了一个String,所以你失去了LocalizedStringKey给你的特殊图像插值。

对于最后一个代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x = "\(Image(systemName: "globe"))"
print(LocalizedStringKey.init(x))
print(LocalizedStringKey.init("\(Image(systemName: "globe"))"))

x是一个包含图像描述的字符串。记住,只有LocalizedStringKey才有真正理解和表示Image的神奇力量。任何其他字符串插值都将回到插值对象的描述。

第一个初始化器是传递一个字符串(如果您在运行时生成键并希望使用它们来查找,则这是唯一一次真正直接使用LocalizedStringKey )。

第二个初始化器使用ExpressibleByStringInterpolation,并使用LocalizedStringKey.StringInterpolation将图像插入到其内部存储中,然后由Text呈现。

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

https://stackoverflow.com/questions/73743661

复制
相关文章
python中带*号的参数,一个星号,两个星号
2.带两个星号(*)参数的函数传入的参数则存储为一个字典(dict),并且再调用是采取a=1,b=2,c=3的形式
狼啸风云
2021/04/01
3.6K0
python 函数参数的传递(参数带星号的说明)
python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要有四种方式: 1.F(arg1,arg2,...) 这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就
hbbliyong
2018/03/05
3.7K0
bgd、sgd、mini-batch gradient descent、带mini-batch的sgd
SGD是最速梯度下降法的变种。使用最速梯度下降法,将进行N次迭代,直到目标函数收敛,或者到达某个既定的收敛界限。每次迭代都将对m个样本进行计算,计算量大。为了简便计算,SGD每次迭代仅对一个样本计算梯度,直到收敛。伪代码如下(以下仅为一个loop,实际上可以有多个这样的loop,直到收敛):
狼啸风云
2021/08/05
9130
星号的作用
星号( * )已经在此前的学习中出现过,它可以作为乘法和乘方的运算符,也可以表示序列中元素的重复。对于函数而言,它的作用则体现在收集参数上。
老齐
2021/10/21
5.1K0
python的星号(*)和双星号(**)用法
在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入或变量的拆解,本文将详细介绍"星号参数"的用法。
matinal
2023/10/13
4210
trick(三)、函数参数前面单星号(*)和双星号(**)的区别
在python的函数中经常能看到输入的参数前面有一个或者两个星号:例如 def foo(param1, *param2): def bar(param1, **param2): 这两种用法其实都是用来将任意个数的参数导入到python函数中。 单星号(*):*agrs 将所以参数以元组(tuple)的形式导入: 例如: >>> def foo(param1, *param2): print param1 print param2 >>> foo(1,2,3,4,5) 1 (
狼啸风云
2022/11/21
8790
星号转移
本关任务:规定输入的字符串中只包含字母和*号。给定程序的功能是将字符串中的前导*号全部移到字符串的尾部。
小Bob来啦
2020/12/16
2.9K0
星号转移
Python中带else子句的for循环执行过程
这几天在厦门讲课,每天6小时,没有太多时间写新代码,宾馆不知道咋想的也不提供WiFi,只好用手机做个热点临时分享一点基础知识,300M的包月流量伤不起,热点瞬间就把仅剩的40M流量用完了,赶紧发完关闭热点。 在Python中,有while和for两种循环,并且都可以带有else子句。其中while循环常用于无法提前确定循环次数的场合,当然也可以用于循环可以提前确定的场合;for循环常用于可以提前确定循环次数的场合,尤其适合用来迭代或遍历可迭代对象中的元素,这也是for循环的本质。 对于带有else子句的循环
Python小屋屋主
2018/04/16
1.6K0
Python中带else子句的for循环执行过程
Java打印菱形星号
先只打印#号, 然后打印*号,找规 双嵌套for循环, 外循环负责控制行数,控制行,控制换行 内循环负责控制列数,控制列,控制列打印的符号 找规律。。用i来表示j的最大值。
昨天50还没用完
2018/06/29
2.9K0
2315. 统计星号
我的思路是遍历字符串,记录|的个数,当其为奇数时,发现*也不计数,如果其为偶数,则计*的个数。比如"l|*e*et|c**o|*de|",设置一个变量flag,遇到第一个|,计数为1,后面遇到*e*et都不计数,然后遇到第二个|,将flag设置为2,然后后面的c**o计数为2,然后遇到一个|,flag设置为3,*de不会计数,然后遇到一个|,flag计数为4。再遇到下一个|之前都计数,但是这里后面没有了,便不计数。
Regan Yue
2023/07/10
1470
SAP QM Batch to Batch的转移过账事务中的Vendor Batch
下午,笔者在微信上收到之前的P项目客户方的合作伙伴邱老师的message,说是问我一个问题。
SAP虾客
2021/03/01
7350
SAP QM Batch to Batch的转移过账事务中的Vendor Batch
深度学习中的batch(batch size,full batch,mini batch, online learning)、iterations与epoch
我们已知在梯度下降中需要对所有样本进行处理过后然后走一步,那么如果我们的样本规模的特别大的话效率就会比较低。假如有500万,甚至5000万个样本(在我们的业务场景中,一般有几千万行,有些大数据有10亿行)的话走一轮迭代就会非常的耗时。这个时候的梯度下降使用了全部的样本数据,所以叫做full batch。
全栈程序员站长
2022/07/31
2.6K0
深度学习中的batch(batch size,full batch,mini batch, online learning)、iterations与epoch
如何隐藏Code39码的星号
CODE 39是 Intermec公司在1975年研制成功的。包括数字、字母和一些符号在内,条形码共包括43个字符。由于可以处理字母,CODE 39在工业领域必不可少,用于汽车、电子等工厂自动化行业。Code 39码支持26个英文大写字母(A-Z),十个数字(0-9),以及符号(-、.、_(空)、*、$、/、+、%)。可以对任意长度的数据进行编码,Code 39码用于物流跟踪、生产线流程等方面,是比较常用的条形码类型之一。39码的起始码和终止码为固定的星号“*”,即39码前后各有一个星号“*”来标识条形码的开始和结束。因为有些用户制作条码时,不需要显示头尾的星号,所以下面我们就介绍如何隐藏这个起始码和终止码。
神奇像素科技
2022/02/14
1.4K0
如何隐藏Code39码的星号
查看星号密码工具
可以查看星号密码的工具: 效果还是很强大的,欢迎使用! 星号密码查看
Youngxj
2018/06/07
4.3K0
Batch Normalization的诅咒
Batch Normalization确实是深度学习领域的重大突破之一,也是近年来研究人员讨论的热点之一。Batch Normalization是一种被广泛采用的技术,使训练更加快速和稳定,已成为最有影响力的方法之一。然而,尽管它具有多种功能,但仍有一些地方阻碍了该方法的发展,正如我们将在本文中讨论的那样,这表明做归一化的方法仍有改进的余地。
石晓文
2020/11/09
8780
Batch Normalization的诅咒
Python字典前双星号(**)的作用
Python中,单星号 * 和双星号 ** 除了作为“乘”和“乘方”的数值运算符外,还在列表、元组、字典的操作中有看到,下面对其进行解释:
狼啸风云
2020/07/01
2.2K0
点击加载更多

相似问题

如何使用PLI例程获取verilog向量端口的尺寸?

13

如何在Modelsim中重新启动Verilog模拟

33

如何使用VPI PLI - verilog VCS查找是否连接了两个Verilog模块

12

Verilog连续模拟

10

如何使用Verilog宏模拟$display?

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文