草庐IT

swift - 如何为不同类型定义通用“无效”值

coder 2023-09-16 原文

在我的应用程序中,我使用整数、 double 、 float 和 CGFloats 来表示许多不同的值。根据我的应用程序的语义,这些值可能会变成“无效”,我使用保留值 i 来表示这种状态。 e. -1。使它在代码中可用的最简单方法是:

anIntVariable = -1
aFloatVariable = -1
aDoubleVariable = -1.0
...

为了摆脱这种约定俗成的方法并提高可读性和适应性,我定义了一些扩展:

extension Int {
    static var invalid = -1
}
extension Float {
    static var invalid = -1.0
}
extension Double {
    static var invalid = -1.0
}
...

所以上面的代码现在应该是:

anIntVariable = .invalid
aFloatVariable = .invalid
aDoubleVariable = .invalid
...

它确实有效。但是,我对这种方法并不满意。你们中有人有更好的表达方式吗?

为了增加一些复杂性,除了像 IntFloatDouble 这样的简单类型之外,我还使用了 Measurement 基于这样的类型:

let length = Measurement(value: .invalid, unit: UnitLength.baseUnit())

如果您找到一种方法在您的解决方案中也包含“无效”测量,则会获得额外的奖励积分......

感谢您的帮助!


一些额外的想法

我知道我可以使用带有 nil 的可选值,意思是“无效”。然而,在这种情况下,您将有条件解包的额外开销......此外,使用 nil 作为“无效”是另一个约定。

没有好坏之分,只是不同而已。 Apple 在其自己的 API 中使用“无效”值,即。 e.如果 View 不在 TableView 中,NSTableView方法row(for:) 将返回-1。然而,我同意这个方法完美地说明了返回一个可选值很有意义......

最佳答案

我会为此使用可选值。

如果您希望缺少值和无效值在您的应用中处于不同状态,我建议为您的值创建一个包装器:

enum Validatable<T> {
   case valid(T)
   case invalid
}

然后像那样使用它:

let validValue : Validatable<Int> = .valid(5)
let invalidValue : Validatable<Int> = .invalid

var validOptionalDouble : Validatable<Double?> = .valid(nil)
validOptionalDouble = .valid(5.0)

let measurement : Validatable<Measurement> = .invalid

等等

然后您可以通过打开该枚举来检查值以访问关联值,如下所示:

switch validatableValue {
case .valid(let value):
    //do something with value
case .invalid:
    //handle invalid state
}

if case .valid(let value) = validatableValue {
    //handle valid state
}

等等

关于swift - 如何为不同类型定义通用“无效”值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52273028/

有关swift - 如何为不同类型定义通用“无效”值的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby - 如何为 emacs 安装 ruby​​-mode - 2

    我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby​​提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. 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类的两个特殊实例的字符串

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

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

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐