草庐IT

ios - Xcode 7 beta 3 的 Swift 2 中的 try/catch 行为不正确?

coder 2023-09-13 原文

我遇到了一些使用 Xcode 7 beta 3 编译的 Swift 2 代码的问题。

我有一个类(见下文),它有一个接受函数 f 的初始化器,它可以抛出异常。如果 f 没有抛出异常,则应将成员变量 (self.result) 设置为包装 f 返回值的枚举实例。如果 f 确实抛出异常,则应将 self.result 设置为指示该值不存在的枚举实例。在初始化程序结束时,self.result 不应为 nil。我检查了 f 不抛出的情况,行为是正确的。但是,在 f 确实抛出异常的情况下,self.result 在初始化程序结束时为 nil(断言被触发)。如果我在调试器中单步执行,我会看到 self.result 似乎立即被设置,然后闪回为 nil。

(注意:您可能建议我将没有结果表示为 nil,而不是包装在枚举中。但是,我需要对 f 的结果尚未计算但已成功计算的场景进行建模,或者已经尝试计算结果但失败了。因此是枚举。)

我是不是误解了 Swift 2 的错误处理机制?或者,编译器/调试器等是否运行不正确?

提前致谢。

internal enum Result<T> {
  case Value(T)
  case None
}

public final class MyClass<T> {

  internal var result: Result<T>? = nil

  private init(f: () throws -> T) {
    let queueName = “some.string”
    let queue = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT)
    dispatch_async(queue) {
      do {
        let value = try f()
        self.result = .Value(value)
      }
      catch {
        self.result = .None
      }
      assert(self.result != nil, "Result must have value before block returns.")
    }
  }
}

最佳答案

self.result = .None

左侧是一个可选 Result,因此.None 右侧被推断为 Optional.None,并且语句 相当于

self.result = nil

你的意思可能是

self.result = Result.None

然后断言不再失败。或者, 使用不同的枚举值,例如case NoValue 在您的自定义中 类型。

关于ios - Xcode 7 beta 3 的 Swift 2 中的 try/catch 行为不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677024/

有关ios - Xcode 7 beta 3 的 Swift 2 中的 try/catch 行为不正确?的更多相关文章

  1. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  2. ruby-on-rails - 如何使用 Xcode 4.5.1 在 OSX Lion 10.8.2 上编译 EventMachine gem - 2

    我找遍了所有我能找到的地方,但似乎找不到解决这个问题的办法。我在Lion10.8.2上使用Xcode4.5.1,并尝试为Rails项目运行bundle,但它一直卡在这上面。我正在为Heroku使用Thingem。Bolanos@Jeremys-Mac-mini⦿-1.9.3fishfarm$sudogeminstalleventmachinePassword:Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingeventmachine:ERROR:Failedtobuildgemnativeextens

  3. ruby-on-rails - Ruby On Rails,周数不正确 (-1) - 2

    我需要当前周数,如果我没有完全弄错的话现在是第51周?然而,当在控制台中测试它时,我得到了这个。Time.now=>2013-12-1911:08:25+0100Time.now.strftime('%U')=>"50"Date.today=>Thu,19Dec2013Date.today.strftime("%U").to_i=>50这是为什么? 最佳答案 Time.now.strftime('%V')将根据ISO8601为您提供周数。 关于ruby-on-rails-RubyOnRa

  4. ruby-on-rails - "cafe"的 Rails 脚手架多元化不正确 - 2

    我想创建一个cafe和一个caveController。当我尝试通过命令使用rails脚手架创建我的cafe时railsgscaffoldcafename:string它将“cafe”的复数形式派生为“caves”,这意味着我无法制作我的cavesController,因为该名称已被使用。如何使Rails使用正确的复数形式? 最佳答案 您可以创建自己的变形。将此添加到您的config/initializers/inflections.rbActiveSupport::Inflector.inflectionsdo|inflect|i

  5. ruby - RVM——警告! PATH 设置不正确 - 2

    我的RVM有问题-我不断收到错误消息,告诉我PATH设置不正确。首先,所有这些听起来都像是来自一个完全的菜鸟,那是因为它确实是。我一直在查看一些类似的线程,但没有任何方法可以帮助我解决问题。任何帮助将不胜感激!当我运行rvmgethead并收到消息时:Warning!PATHisnotproperlysetup,'/Users/mbauer/.rvm/src/rvm/gems/ruby-2.1.0/bin'isnotatfirstplace,usuallythisiscausedbyshellinitializationfiles-checkthemfor'PATH=...'entri

  6. ruby-on-rails - Rails 4.0.3 使用 asset_sync 生成不正确的 Assets 路径 - 2

    我以前多次使用asset_syncgem并取得了很大的成功,但是在Rails4.0.3项目中使用它似乎导致了问题。Assets被上传、散列并gzip到目标目录(我只是使用默认的“Assets”),但是在暂存/生产环境中运行应用程序时,路径不正确。它们的形式是:S3_DOMAIN.com/stylesheets/application.css代替:S3_DOMAIN.com/assets/application-HASH.css有没有人遇到过这个问题?我发现扭转这种行为的唯一方法是将config.assets.compile设置为true,但这在生产环境中行不通。这里是相关的配置文件:#

  7. ruby - 开始使用 MacRuby 和 Xcode 4.2 - 2

    我最近想开始使用MacRuby。我已经安装了Xcode4.2和MacRuby,但显然我遗漏了一些东西。到目前为止,在我发现的每个教程中都说,我必须从Xcode模板中选择“MacRuby应用程序”……但是没有这样的条目可用。我试过0.10和几天前发布的每晚版本。我查看了MacRuby的安装位置,我找到了Xcode3.0的模板……我必须使用这些模板吗?如何将它们导入Xcode4.2?在开始之前,我还想知道,从MacRuby开始是否安全?乍一看,我认为"is",因为有新的MacRuby书籍可用——但MacRuby网站上似乎没有太多事件(去年3月的最后一篇博客文章?)……根据我的经验,这可能是

  8. ruby - 在 Xcode 运行脚本构建阶段使用 rvm 强制指定 Ruby - 2

    在Xcode之外,我使用特定版本的Ruby,使用RVM管理多个Ruby安装。Apple的命令行开发工具将Ruby安装在/usr/bin/ruby并且版本为1.8.7。我通过RVM使用1.9.3。有没有办法强制Xcode在运行其运行脚本构建阶段时使用我的1.9.3安装?我已经尝试将Shell路径设置为我的特定Ruby的完整路径,但这似乎没有什么不同,我的意思是我在1.9.3中安装的特定Gems不可用/在Xcode中运行时对脚本可见。如果我在命令行上通过xcodebuild运行我的项目,运行脚本阶段会使用我的特定Ruby,因为它是从我的shell环境中运行的(即使项目文件中的Shell路径

  9. ruby - 逻辑回归给出不正确的结果 - 2

    我在一个网站上工作,收集人们玩过的国际象棋比赛的结果。查看玩家的评分以及他们与对手的评分之间的差异,我绘制了一个图表,其中的点代表获胜(绿色)、平局(蓝色)和失败(红色)。根据这些信息,我还实现了逻辑回归算法来对获胜和获胜/平局的截止值进行分类。使用评级和差异作为我的两个特征,我得到了一个分类器,然后在图表上绘制了分类器改变其预测的边界。我的梯度下降、成本函数和sigmoid函数的代码如下。defgradient_descent()oldJ=0newJ=J()alpha=1.0#Learningraterun=0while(run0.001))thenrun-=20end#Do20mo

  10. ruby-on-rails - 是否有针对 Rails、Ruby、Erb 的 Xcode 语法着色?如果没有,我怎么能自己写一个? - 2

    Xcode的语法着色充其量只是很差,而textmate看起来不错,但我喜欢Xcode,因为我也用C++编程。我想将所有内容都放在一个地方并利用其他Xcode功能。有没有人已经这样做过或者有没有简单的方法来做到这一点? 最佳答案 你可以去Editor>SyntaxColoring>CheckHTMLanddoitagainforRuby 关于ruby-on-rails-是否有针对Rails、Ruby、Erb的Xcode语法着色?如果没有,我怎么能自己写一个?,我们在StackOverflo

随机推荐