【问题标题】:Swift2: return a optional type objectSwift2:返回一个可选类型对象
【发布时间】:2015-11-20 10:01:30
【问题描述】:

我是 swift2 世界的新手,我目前正在为一个简单的功能而苦恼:

// Get all moves for the first category
func getMuscles() -> BodyPart {

        let bpart:BodyPart?

        if let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext {
            do{
                let fetchRequest = NSFetchRequest(entityName: "BodyPart")
                let fetchResults = try managedObjectContext.executeFetchRequest(fetchRequest) as! [BodyPart]
                bpart = fetchResults[0]
            } catch let error as NSError  {
                print(error)
                bpart = nil
            }
        }
        return bpart
}

我该如何解决这个问题? swift2中定义函数的“最佳实践”是什么?

谢谢


编辑 1

我已尝试更改方法的签名,但仍然出现错误:

【问题讨论】:

  • 你可以定义函数返回BodyPart?
  • 但是不要这样做:let muscles = getMuscles()! 谷歌的东西:可选绑定

标签: swift swift2 optional


【解决方案1】:

您应该问自己的问题是getMuscles() 是否必须始终返回一个对象,或者它是否可以返回一个 nil。

通过将方法签名更改为func getMuscles() -> BodyPart?, 您基本上是在说明该方法可能会返回 nil, 从而解决您的即时编译时间问题。

在那个特定的上下文中,因为您要从 CoreData 获取对象, 允许getMuscles() 返回零可能是明智之举。

您定义函数的方式(如果它们返回可选参数?,或不返回)完全取决于调用代码。

【讨论】:

  • 谢谢。我已经更新了我的帖子(我已经更改了我的方法签名,但错误仍然存​​在)。谢谢
  • @johann let bpart : BodyPart? = nil 但这无济于事。完全删除 bpartreturn fetchResults[0] 而不是 bpart = fetchResults[0] ,在 catch 内:return nil,最后:return nil
  • 另一个选项是将bpartlet 更改为var。但我可能会做@R Menke 刚才描述的事情。
  • @Tsimmi true,看了一眼。
【解决方案2】:

将您的方法签名更改为: func getMuscles() -> 身体部位?

但在调用 this 函数时打开返回值时要小心。

【讨论】:

    【解决方案3】:

    返回:

    func getMuscles() -> BodyPart? { }
    

    【讨论】:

      【解决方案4】:

      这与 SWIFT2 无关.. 返回类型期望某个值 BodyPart 不是可选值 BodyPart?...但是您返回的是可选值 bpart

      func getMuscles() -> BodyPart {
      
              let bpart:BodyPart?
      
            ....
              return bpart
      }
      

      如果要按原样返回 bpart,则需要将返回类型创建为可选

      func getMuscles() -> BodyPart? {
      
              let bpart:BodyPart?
      
            ....
              return bpart
      }
      

      或者如果你只想返回值试试这个

      func getMuscles() -> BodyPart {
      
              let bpart:BodyPart = ()//initialize here dont make optional
      
            ....
              return bpart
      }
      

      【讨论】:

      • 谢谢。我已经尝试了你的两个代码,但错误仍然存​​在(我已经更新了我的消息)
      • 您还没有初始化 bpart ...而是将 let 更改为 var...并对其进行初始化...如果您想让 bpart 成为可选
      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多