2015-04-22 51 views
0

因此我在故事板上自动生成饼图,其中包含Age,CurrentAsset,Income等各种标签,滑块,按钮等。我使用struct构建模型,并保留即使你可以看到我有currentAssetFactor,savingsFactor,bondFactor,toleranceFactor,outlookFactor的返回值,也会出现几个方法的错误,这些方法的“缺少希望返回的函数返回'Double''。我究竟做错了什么?在函数中缺少返回 - 模型

public struct AllocationModel 
{ 
    let maxAge = 95.0 
    let currentAge: Double 

    let minCurrentAsset = 100000.0 
    let maxCurrentAsset = 500000.0 
    let currentAsset: Double 

    let minSavings = 5000.0 
    let maxSavings = 20000.0 
    let currentSavings: Double 

    let maxIncomeRequired = 0.04 
    let minIncomeRequired = 0.01 
    let currentIncomeRequired: Double 

    let tolerance: String 

    let outlook: String 

    // MARK: - Methods 

    public var currentAssetFactor: Double { 
    if currentAsset > maxCurrentAsset { 
     return 5.0 
    } else if currentAsset >= minCurrentAsset { 
     return Double(currentAsset/minCurrentAsset) 
    } 
    } 

    public var savingsFactor: Double { 
    if currentSavings >= maxSavings { 
     return 4.0 
    } else if currentSavings >= minSavings { 
     return Double(currentSavings/minSavings) 
    } 
    } 

    public var bondFactor: Double { 
    if currentIncomeRequired >= maxIncomeRequired { 
     return 0.2 
    } else if currentIncomeRequired >= minIncomeRequired { 
     return (0.05 * Double(currentIncomeRequired/minIncomeRequired)) 
    } 
    } 

    public var toleranceFactor: Double { 
    switch tolerance { 
     case "conservative": return 0.0 
     case "balanced": return 3.0 
     case "aggressive": return 6.0 
    default: 0.0 
    } 
    } 

    public var outlookFactor: Double { 
    switch outlook { 
     case "poor": return 0.0 
     case "moderate": return 7.0 
     case "strong": return 10.0 
    default: return 0.0 
    } 
    } 


    public var stock: Double { 
    return maxAge - currentAge + currentAssetFactor + savingsFactor + toleranceFactor + outlookFactor 
    } 

    public var nonStock: Double { return 100.0 - stock } 

    public var bondPercentage: Double { return 0.35 + bondFactor } 

    public var bond: Double { return nonStock * bondPercentage } 

    public var cash: Double { return nonStock - bond } 

    // MARK: - Init 

    public init(currentAge: Double, currentAsset: Double, currentSavings: Double, currentIncomeRequired: Double, tolerance: String, outlook: String) { 
    assert(currentAge > 0) 

    self.currentAge = currentAge 
    self.currentAsset = currentAsset 
    self.currentSavings = currentSavings 
    self.currentIncomeRequired = currentIncomeRequired 
    self.tolerance = tolerance 
    self.outlook = outlook 
    } 

} 

回答

1

你没有涵盖每一个案例。考虑你的方法之一:

public var currentAssetFactor: Double { 
    if currentAsset > maxCurrentAsset { 
     return 5.0 
    } else if currentAsset >= minCurrentAsset { 
     return Double(currentAsset/minCurrentAsset) 
    } 
    } 

好。那么,如果所述第一if失败(例如currentAsset不大于maxCurrentAsset更大)和第二if失败(例如currentAsset大于或等于minCurrentAsset)?现在我们不回报任何东西!

所以你的逻辑有一个漏洞。编译器很聪明 - 比你更聪明!这是所以聪明,它在你的逻辑中发现这个洞,并阻止你在你的轨道上。你需要以这样的方式重写你的方法,以便证明给编译器,覆盖了每一种可能性,也就是说你会总是返回一个值,不管是什么。

+1

您应该考虑将此作为案例陈述书写......它将帮助您找出遗漏的案例 – Jeef

+0

添加到此答案中,在'outlookFactor'默认值:在交换机内部,您忘记了'return 0.0' –

+0

@Jeef very好点,我正在考虑补充。 – matt