草庐IT

关于 swift:原始类型 ‘Bool’ 不能用任何文字表达

codeneng 2023-03-28 原文

Raw type 'Bool' is not expressible by any literal

我想让我的枚举与 @IBInspectable 轻松兼容,所以为了简单起见,我尝试让它可以用类型 Bool:

表示

1
2
3
4
enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}

但是 Xcode 给了我:

Raw type 'Bool' is not expressible by any literal

这很奇怪,因为 truefalse 似乎是文字表达能力的完美候选者。

我还尝试将 RawRepresentable 一致性添加到 Bool 类型:

1
2
3
4
5
6
7
8
extension Bool: RawRepresentable {
    public init?(rawValue: Bool) {
        self = rawValue
    }
    public var rawValue: Bool {
        get { return self }
    }
}

但它并没有解决错误。

  • 文档非常清楚:developer.apple.com/library/content/documentation/Swift/…:"原始值可以是字符串、字符或任何整数或浮点数类型。
  • 您可以通过在枚举上添加计算的 var boolValue 来实现相同的效果。
  • 添加到@MartinR 的评论中, truefalse 不是文字;它们更接近常量(名称由编译器保留的常量)。文字是编译器有一些魔法可以转换为内部值的东西。理解 truefalse 不需要任何魔法,因为它们是关键字。


Swift 3 原生定义了这九种文字表示:

  • ExpressibleByNilLiteral (nil)
  • ExpressibleByBooleanLiteral (false)
  • ExpressibleByArrayLiteral ([])
  • ExpressibleByDictionaryLiteral ([:])
  • ExpressibleByIntegerLiteral (0)
  • ExpressibleByFloatLiteral (0.0)
  • ExpressibleByUnicodeScalarLiteral ("\\u{0}")
  • ExpressibleByExtendedGraphemeClusterLiteral ("\\u{0}")
  • ExpressibleByStringLiteral ("")

enum 原始表示显然只接受以数字 (0-9)、符号 (-, +) 或引号 ("): 上面列表的最后五个协议。

在我看来,错误信息应该更具体。也许像这样明确的东西会很好:

Raw type 'Bool' is not expressible by any numeric or quoted-string literal

扩展 Bool 以符合其中一种协议仍然是可能的,例如:

1
2
3
4
5
extension Bool: ExpressibleByIntegerLiteral {
    public init(integerLiteral value: Int) {
        self = value != 0
    }
}

在这样做之后,这段代码现在构建得很好:

1
2
3
4
5
6
enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}

@IBInspectable var style = TopBarStyle(rawValue: false)!

我在 swift 3 上的解决方案

1
2
3
4
5
6
7
8
9
10
11
12
enum DataType: RawRepresentable {
    case given
    case received

    typealias RawValue = Bool
    var rawValue: RawValue {
        return self == .given ? true : false
    }
    init?(rawValue: RawValue) {
        self = rawValue == true ? .given : .received
    }
}

  • 有趣的。所以 extension Bool: RawRepresentable enum DataType: Bool 不起作用,但直接 enum DataType: RawRepresentable 会起作用。
  • 请注意,此处不需要 typealias
  • 请注意,这一行(return self == .given ? true : false)将导致递归。所以请改用开关盒。


我不认为这是必要的。你可以只做一个普通的枚举,然后切换它的案例。此外,完全不清楚 TopBarStyle(rawValue: true) 如果可以实现这将意味着什么。

我会使用 var darkOnLight: Boolenum TopBarStyle { /*cases*/ } 并根据需要切换大小写。


简化你的生活:

1
2
3
4
5
6
7
8
9
10
11
12
13
enum TopBarStyle {
    case darkOnLight
    case lightOnDark

    var bool: Bool {
        switch self {
        case .darkOnLight:
            return true
        default:
            return false
        }
    }
}

照常使用:

1
2
3
4
5
6
7
    var current = TopBarStyle.darkOnLight

    if current.bool {
        // do this
    } else {
        // do that
    }

您可以将案例扩展到更多,但它们是不可逆的,因为它是一个 N : 2 矩阵

  • 这不会使它与 @IBInspectable 兼容。因此,在这方面,接受的答案更有帮助。
  • 当 swift RawRepresentable 为您提供灵活性时,为什么要使用 Extra '.bool'。
  • 我重新创建了它以使我更容易访问某些预定义的 SCNVector3 值。超级好答案!

有关关于 swift:原始类型 ‘Bool’ 不能用任何文字表达的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  3. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  4. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  10. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

随机推荐