【问题标题】:Using function returns in other calculations within same function在同一函数内的其他计算中使用函数返回
【发布时间】:2021-02-19 12:01:46
【问题描述】:

我已经在 ObservableObject 类中的函数中计算了一个值,现在我想使用该类中另一个计算中返回的值。

代码如下,注意事项:-

  1. hole1index 是从 Core Data 获取的一项数据。
  2. 第一个函数 (p1h1shots) 完美运行并返回正确的值。
  3. 第二个函数 (p1h1net) 需要使用 p1h1shots 的输出来计算返回值。
  4. 我尝试以多种方式构造第二个函数,但不断收到类似的错误消息“无法将类型 '(Int16) -> Int16' 的值转换为预期的参数类型 'Int16' 显示的代码p1h1net的返回行有这个错误信息。

我对 Swiftui 比较陌生,所以可能缺少一些基本的东西,任何指针或线索都将不胜感激。如果有任何其他信息有帮助,请告诉我。

提前致谢

import SwiftUI
import CoreData

class ScoreManager : ObservableObject {
 
    @Published var player1 = ""
    @Published var player2 = ""
    @Published var p1handicap = 0
    @Published var p2handicap = 0
    @Published var p1hole1gross = 0
    @Published var p1hole2gross = 0
    
    func p1h1shots(hole1index: Int16) -> Int16 {
        
        let hand = Int16(p1handicap)
        let shot = hand - hole1index
  
        if shot < 0 {
            return Int16(0)
        }
        
        if shot < 0 {
            return Int16(0)
        }
        
        if shot >= 0 && shot < 18 {
            return Int16(1)
        }
        
        if shot >= 18 && shot < 36 {
            return Int16(2)
        }
        
        if shot >= 36 && shot < 54 {
            return Int16(3)
        }
        return Int16(0)
    }

func p1h1net() -> Int16 {
        
        let gross = Int16(p1hole1gross)
        let shot = p1h1shots
        
        return Int16(gross - shot)
        
    }
}

【问题讨论】:

    标签: function class types swiftui calculation


    【解决方案1】:

    首先第二个if shot &lt; 0 表达式是多余的。

    如果没有括号,您将把 函数 分配给shot,而您必须使用参数调用它

    let shot = p1h1shots(hole1index: someInt16)
    

    p1h1shots 可以用switch 更有效地编写

    func p1h1shots(hole1index: Int16) -> Int16 {
    
        let hand = Int16(p1handicap)
        let shot = hand - hole1index
        
        switch shot {
            case 0..<18: return 1 // the literal is returned as Int16
            case 18..<36: return 2
            case 36..<54: return 3
            default: return 0
        }
    }
    

    或者更短

    func p1h1shots(hole1index: Int16) -> Int16 {
    
        let hand = Int16(p1handicap)
        let shot = hand - hole1index
        
        return 0..<54 ~= shot ? shot / 18 + 1 : 0
    }
    

    【讨论】:

    • 非常感谢您的快速回复。修改后的 p1h1shots 效果很好,对我来说是一个很好的学习。关于镜头的修订代码,我收到“无法在范围内找到'someInt16'”的错误,这是一个代码项还是我应该在那里对某个项目进行某种引用,如果是的话我应该是什么引用?
    • someInt16 只是一个占位符,我不知道参数应该是什么,可能是gross 或者一些文字。
    • vadian 我尝试使用与在视图 p1h1shots(hole1index: course.hole1index) 中显示返回值相同的代码,其中 course 是存储hole1index 的核心数据实体,但我随后得到“在范围内找不到‘课程’的错误。如果我添加 @ObservedObject var course: Course 以将其纳入范围,我会收到“类‘ScoreManager’没有初始化程序”的错误。我之前没有使用过初始化程序所以不是确定它需要什么,您对现有信息有什么想法吗?如果没有,我将不得不做一些研究!感谢您的意见,到目前为止它真的很有帮助。
    • 对不起,我对 SwiftUI 不熟悉,这是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2017-02-02
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2016-12-05
    相关资源
    最近更新 更多