草庐IT

swift - Swift 或其他语言中 Optionals 的术语

coder 2023-09-04 原文

在 Swift 中,我们操作的元素都有类型。

当我们使用这些类型时,我们可以添加“!”、“?”或来表达它们的可空性。

  1. 我应该怎么称呼“?”或“!”来表达这种特质?

类型装饰器?装饰师?运算符(operator) ?还有别的吗?

  1. 我应该如何称呼使用这个字符时创建的类型?

它是一种新类型吗?它是装饰型的吗?类型变体?

swift 编译器似乎将它们视为新类型,但是我的问题与实现或语言无关,因此我将其标记为与语言无关。

编辑:我正在寻找一个与语言无关的名称。我了解到 pranjalsatija 的注释选项被定义为 复合类型。 但是,这是一个语言实现细节。 我可以将我的问题改写为:

类型定义中有特殊含义的字符怎么称呼,派生类型怎么称呼

这个术语应该适用于 ruby​​ 中的大写字母常量,因为概念相似。

最佳答案

?在类型的末尾不是装饰器或操作符。它是 Swift 中的硬编码语法糖,可让您缩短 Optional<Thing>Thing? .

?并没有真正的名字(至少我从未听过 Swift 团队中的任何人使用过名字),在语言引用中它只是被描述为“后缀 ? ”。语言语法并未将其归入句法范畴。

同样,[Thing]Array<Thing> 的简写, 但在此上下文中没有方括号的名称。

描述Option<Int>作为“派生自”Int将是滥用“派生”一词。如果您愿意,可以将其描述为“Optional专门用于 Int ”。

事实上,您可能正在寻找与语言无关的术语,以了解 Swift 如何允许您构建适用于任何类型的类型(如 Optional<T>Array<T>)T不用关心什么T实际上是。在这种情况下,术语可能是 generics .

!有点不同。当应用于 Thing! 中的类型名称时, 它是 ImplicitlyUnwrappedOptional<Thing> 的简写, 与 ? 相同.

!当应用于 Thing? 类型的变量时等效于测试可选的后缀运算符,如果它是 nil , 终止你的程序,像这样:

postfix operator !<T>(value: T?) -> T {
    if let unwrapped = value {
        return unwrapped
    }
    else {
       fatalError("unexpectedly found nil while unwrapping an Optional value")
    }
}

所以在这种情况下,!可以说是算子。但不是在第一个上下文中。

有关给定语言用来描述可选值的术语,请参阅 Option type维基百科页面。

关于swift - Swift 或其他语言中 Optionals 的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246393/

有关swift - Swift 或其他语言中 Optionals 的术语的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

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

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

  3. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. HarmonyOS原子化服务开发相关术语 - 2

    术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助

  6. ruby-on-rails - Ruby on Rails,在更新其他列值时更改列值 - 2

    我在Rails模型中有两列相互关联:Article.bodyArticle.body_updated_on每次Article.body更新时,我想将Article.body_updated_on更改为Time.now。如果任何其他字段已更新,则无需进行任何操作。 最佳答案 只需在将回调保存到您的文章模型之前添加classArticle 关于ruby-on-rails-RubyonRails,在更新其他列值时更改列值,我们在StackOverflow上找到一个类似的问题:

  7. ruby-on-rails - 用一系列时间增量填充选择,加上其他选项 - 2

    使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour

  8. ruby - 如果哈希中只有一个特定键具有真值(所有其他值均为假),如何返回真 - 2

    例如:options={fight:true,use_item:false,run_away:false,save_game:false}我想要一个计算结果为true的bool表达式,当且仅当:fight为true,其余为false(如上图所示)。我可以一起解决这个问题,但我正在努力训练自己编写更优雅的ruby​​。谢谢!编辑:黑客是:(options[:fight]==true&&options.delete(:fight).values.all{|x|!x}) 最佳答案 假设所有值都是严格的bool值,它很简单:options=

  9. ruby - 这在 Ruby 语言中是什么意思? - 2

    运行下面的代码,a=[1,2,3,4,5]head,*tail=apheadptail你会得到结果1[2,3,4,5]谁能帮我解释一下语句head,*tail=a,谢谢! 最佳答案 head,*tail=a表示将数组a的第一个元素赋值给head,其余元素赋值到尾部。*,有时称为“splat运算符”,可以对数组执行多种操作。当它位于赋值运算符(=)的左侧时,如您的示例所示,它仅表示“保留所有剩余内容”。如果您在该代码中省略了splat,它将改为执行以下操作:head,tail=[1,2,3,4,5]phead#=>1ptail#=>2

  10. python - 解释性语言中的链接和加载 - 2

    在编译型语言中,源代码由编译器转化为目标代码,不同的目标文件(如果有多个文件)由链接器链接并由加载器加载到内存中执行。如果我有一个使用解释性语言(例如ruby​​或python)编写的应用程序,并且如果源代码跨多个文件拆分,那么这些文件究竟何时组合在一起。换句话说,链接何时完成?解释型语言一开始就有链接器和加载器,还是解释器包揽一切?我真的很困惑,无法理解它!!谁能对此有所启发?! 最佳答案 解释型语言或多或少是可执行文件的大型配置,称为解释器。该可执行文件(例如/usr/bin/python)是实际运行的程序。然后它读取它要执行的

随机推荐