当我执行以下操作时:
let gapDuration = Float(self.MONTHS) * Float(self.duration) * self.gapMonthly;
我得到错误:
Binary operator '*' cannot be applied to operands of type 'Float' and 'Float!'
但是当我这样做的时候:
let gapDuration = 12 * Float(self.duration) * self.gapMonthly;
一切正常。 我不知道这个错误告诉我什么。
self.gapMonthly 是 Float! 类型,self.duration 和 self.MONTHS 是类型Int!
最佳答案
我会认为这是一个错误(至少,该错误具有误导性),并且在尝试对 3 个或更多计算结果为给定类型的表达式使用二元运算符时似乎存在,其中一个或多个这些表达式是该类型的隐式解包可选。
这只是将类型检查器延伸得太远了,因为它必须考虑将 IUO 视为强可选的所有可能性(因为 SE-0054 如果 IUO 可以被类型化,编译器会将其视为强可选-检查为一个),同时尝试为运算符找到正确的重载。
乍一看,它似乎与 How can I concatenate multiple optional strings in swift 3.0? 中显示的问题类似– 然而,该错误已在 Swift 3.1 中得到修复,但该错误仍然存在。
重现相同问题的最小示例是:
let a: Float! = 0
// error: Binary operator '*' cannot be applied to operands of type 'Float' and 'Float!'
let b = a * a * a
并且存在于除*之外的其他二元运算符:
// error: Binary operator '+' cannot be applied to operands of type 'Float' and 'Float!'
let b = a + a + a
在混合 Float 表达式时(只要至少保留一个 Float! 表达式),以及显式注释 b 时,它仍然可以重现 作为 Float:
let b: Float = a * a * a // doesn't compile
let a: Float! = 0
let b: Int = 0
let c: Int = 0
let d: Float = a * Float(b) * Float(c) // doesn't compile
解决这个问题的一个简单方法是显式强制解包表达式中隐式解包的可选项:
let d = a! * Float(b) * Float(c) // compiles
这减轻了类型检查器的压力,因为现在所有表达式的计算结果都是 Float,因此重载解析变得更加简单。
当然,如果 a 为 nil,这当然会崩溃。一般来说,你应该尽量避免使用隐式展开的可选值,而更喜欢使用强可选值——并且,如 @vadian says , 在值为 nil 没有意义的情况下始终使用非可选值。
如果您需要使用一个可选的并且不能 100% 确定它包含一个值,您应该在进行算术运算之前安全地解包它。一种方法是使用 Optional 的 map(_:)传播可选性的方法:
let a: Float! = 0
let b: Int = 0
let c: Int = 0
// the (a as Float?) cast is necessary if 'a' is an IUO,
// but not necessary for a strong optional.
let d = (a as Float?).map { $0 * Float(b) * Float(c) }
如果a 不为零,d 将被初始化为a 的展开值乘以Float 的结果(b) 和 Float(c)。但是,如果 a 为 nil,则 d 将被初始化为 nil。
关于swift - 二元运算符 '*' 不能应用于类型 'Float' 和 'Float!' 的操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250149/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>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
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳