0-1*_*0-1 8 enums literals swift
Bug > Swift > Enum >字符串协议
我试图创建一个枚举,其中所有元素都是文件名,我偶然发现了一些有趣的东西。像这样:
enum FileNames: String {
case main = #file
}
Run Code Online (Sandbox Code Playgroud)
这导致了内部错误。(分段错误:11)
我能够弄清楚如何获得实际的错误消息:
enum Foo: String {
case one = "\(1)"
}
Run Code Online (Sandbox Code Playgroud)
Error: Raw value for enum case must be a literal
相关问题:
• 是否#file被视为字符串文字?
• 为什么会#file破坏枚举?这应该在 bugs.swift.org 上报告吗?
• 我注意到替换StringtoInt和#fileto#line会导致相同的问题。这是暗示吗?
我以为他们做到了,但我犯了一个错误。它也会导致相同的内部错误。
import UIKit
enum ColorEnum: UIColor {
case foo = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0)
}
Run Code Online (Sandbox Code Playgroud)
根据 Apple 的说法,#file被认为是字面意思:
这些也会使编译器崩溃。
enum Foo: String? {
case breaks = nil
}
Run Code Online (Sandbox Code Playgroud)
23个大规模杀伤性特征
enum I:Int?{case a=nil}
崩溃现已修复,已在此处正式合并到 Swift:在 GitHub 上合并 这是错误报告:SR-12998。它已在 Swift 5.4 中正式实现
添加支持!
这里支持使用魔法文字作为枚举案例的原始值:SR-13022
是的,#file和#line是文字表达式,但您的程序仍然格式不正确。
Swift 语言参考说:
\n\n\n文字表达式由普通文字(例如字符串或数字)、数组或字典文字、游乐场文字或以下特殊文字之一组成:
\n\n
#file\xe2\x80\x94 字符串 \xe2\x80\x94 它所在的文件的名称。\n
#line\xe2\x80\x94 Int \xe2\x80\x94 它出现的行号。[...]
\n
我们还要注意语法:
\nliteral-expression \xe2\x86\x92 literal\nliteral-expression \xe2\x86\x92 array-literal | dictionary-literal | playground-literal\nliteral-expression \xe2\x86\x92 #file | #line | #column | #function | #dsohandle\nRun Code Online (Sandbox Code Playgroud)\n现在让我们考虑一下您定义的枚举的语法。我在这里只包含最相关的部分,您可以自己验证完整的推论:
\nenum-declaration \xe2\x86\x92 attributes opt access-level-modifier opt raw-value-style-enum\n[...]\nraw-value-style-enum \xe2\x86\x92 enum enum-name generic-parameter-clause opt type-inheritance-clause generic-where-clause opt { raw-value-style-enum-members }\n[...]\nraw-value-assignment \xe2\x86\x92 = raw-value-literal\nraw-value-literal \xe2\x86\x92 numeric-literal | static-string-literal | boolean-literal\nRun Code Online (Sandbox Code Playgroud)\n值得注意的是,只允许numeric-literal、static-string-literal、boolean-literal 。如果我们查看它们的定义,很明显这些#文字不符合raw-value-literal规则:
numeric-literal \xe2\x86\x92 -opt integer-literal | -opt floating-point-literal\nboolean-literal \xe2\x86\x92 true | false\nRun Code Online (Sandbox Code Playgroud)\nstatic-string-literal \xe2\x86\x92 string-literal-opening-delimiter quoted-text opt string-literal-closing-delimiter\nstatic-string-literal \xe2\x86\x92 multiline-string-literal-opening-delimiter multiline-quoted-text opt multiline-string-literal-closing-delimiter\nRun Code Online (Sandbox Code Playgroud)\n完全定义static-string-literal的所有相关规则都很长,但是看到static-string-literal不能被推导#file并且不能包含插值仍然是微不足道的。(这就是它静态的原因。)
所以 Swift 编译器拒绝你的程序确实是正确的。尽管如此,现代编译器不应该简单地因非法程序而崩溃,因此可能值得报告此问题。
\n| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |