gpt4 book ai didi

swift - #file 是否被视为 Swift 中的文字字符串?

转载 作者:行者123 更新时间:2023-12-03 09:19:44 26 4
gpt4 key购买 nike

错误 > swift > 枚举 > 字符串协议(protocol)

我试图创建一个枚举,其中所有元素都是文件名,我偶然发现了一些有趣的东西。像这样:

enum FileNames: String {
case main = #file
}
这导致了内部错误。 (段错误:11)

我能够弄清楚如何获得实际的错误消息:
enum Foo: String {
case one = "\(1)"
}
Error: Raw value for enum case must be a literal
相关问题:
• 是 #file认为是字符串文字?
• 为什么 #file打破枚举?这应该在 bugs.swift.org 上报告吗?
• 我注意到替换 StringInt#file#line导致同样的问题。这是提示吗?

颜色文字不起作用
我以为他们做到了,但我犯了一个错误。它也会导致相同的内部错误。
import UIKit

enum ColorEnum: UIColor {
case foo = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0)
}

Swift 编程语言 (Swift 5.2)
据苹果称, #file被认为是文字:
#file is described as a literal according to Apple

那么 nil 字面量呢?
这些也会使编译器崩溃。
enum Foo: String? {
case breaks = nil
}

23个大规模毁灭性人物 enum I:Int?{case a=nil}
错误修复
崩溃现已修复,已在此处正式合并到 Swift: Merged on GitHub
这是错误报告: SR-12998 .它已在 Swift 5.4 中正式实现
添加支持!
这里支持使用魔法文字作为枚举案例的原始值: SR-13022

最佳答案

是的,#file#line是文字表达式,但您的程序仍然格式错误。
Swift 语言引用 says :

A literal expression consists of either an ordinary literal (such as a string or a number), an array or dictionary literal, a playground literal, or one of the following special literals:

#file — String — The name of the file in which it appears.

#line — Int — The line number on which it appears.

[...]


我们还要注意语法:
literal-expression → literal
literal-expression → array-literal | dictionary-literal | playground-literal
literal-expression → #file | #line | #column | #function | #dsohandle
现在让我们考虑 grammar of the enum你正在定义。我在这里只包括最相关的部分,您可以自己验证完整的推论:
enum-declaration → attributes opt access-level-modifier opt raw-value-style-enum
[...]
raw-value-style-enum → enum enum-name generic-parameter-clause opt type-inheritance-clause generic-where-clause opt { raw-value-style-enum-members }
[...]
raw-value-assignment → = raw-value-literal
raw-value-literal → numeric-literal | static-string-literal | boolean-literal
值得注意的是,只有 numeric-literal , static-string-literal , boolean-literal被允许。如果我们查看它们的定义,很明显那些 #因此,文字与 raw-value-literal 不匹配规则:
numeric-literal → -opt integer-literal | -opt floating-point-literal
boolean-literal → true | false
static-string-literal → string-literal-opening-delimiter quoted-text opt string-literal-closing-delimiter
static-string-literal → multiline-string-literal-opening-delimiter multiline-quoted-text opt multiline-string-literal-closing-delimiter
完全定义 static-string-literal 的所有相关规则都很长,但是看到 static-string-literal 不能推导出为 #file 仍然是微不足道的。并且不能包括插值。 (这就是使它成为静态的原因。)
所以 Swift 编译器拒绝你的程序确实是正确的。尽管如此,现代编译器不应该简单地在非法程序上崩溃,因此可能值得报告这个问题。

关于swift - #file 是否被视为 Swift 中的文字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61683457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com