swift - 用一个函数返回几个结果

标签 swift function class

我想使用多个函数(如最小值、最大值...)并使用函数 determineStatistics 返回所有结果,以将考试 block 变为真。

我尝试添加一个初始化并返回统计类。但我认为这不是解决问题的正确方法?

class statistic{
    var Minimum:Int?;
    var Maximum:Int?;
    var Average:Double?;
    var Median:Double?;

    init (Minimum:Int?, Maximum:Int?, Average:Double?, Median:Double?){
        self.Minimum=Minimum;
        self.Maximum=Maximum;
        self.Average=Average;
        self.Median=Median;
    }

}



func Summ(input input:[Double]) -> Double? {
    var memory:Double=0;

    if input.count == 0{
        return nil
    }

    for number in input{
        memory=memory+number
    }
    return memory;
}

func Average(input input:[Double]) -> Double? {
    var sum=Summ(input: input)
    var countedInput:Double = Double(input.count)

    if countedInput == 0.0{
        return nil
    }

    return sum!/countedInput;
}

func Minimum(input input:[Int]) -> Int? {
    var memory:Int?=0;

    if input.count == 0{
        return nil
    }

    for i in input{
        for j in input{
            if i<j{
                memory=i;
            }
        }
    }
    return memory;
}

func Maximum(input input:[Int]) -> Int? {
    var memory:Int=0;

    if input.count == 0{
        return nil
    }

    for i in input{
        for j in input{
            if i>j{
                memory=i;
            }
        }
    }
    return memory;
}

func sort(input input:[Int]) -> [Int] {
    var data = input

    for i in 0..<data.count-1{
        for j in 0..<data.count-1{
            if (data[j] > data[j+1]){
                var temp = data[j+1]
                data[j+1] = data[j]
                data[j+1] = temp
            }
        }
    }
    return data;
}


func Median(input input:[Int]) -> Int? {

    if input.count == 0{
        return nil
    }

    var median = sort(input: input)
    var medi = input.count
    var me = medi/2

    return median[me]
}


//The function determineStatistics() should output a statistic-object with all calculable datas

func determineStatistics(_ input:[Int]) -> statistic {
    var result = statistic(Minimum: Minimum(input: input),Maximum: Maximum(input: input),Average: Average(input: input),Median: Median(input: input));
    return result;
}
//here I get the error: Cannot convert value of type [Int] to expected argument type [Double]

//exam block - sould turn true
let a4adata = determineStatistics([1,2,3,4,5,6,7,8,9,10]);
let a4a = a4adata.Minimum == 1 && a4adata.Maximum == 10 && a4adata.Average == 5.5 && a4adata.Median == 6;
let a4bdata = determineStatistics([]);
let a4b = a4bdata.Minimum == nil && a4bdata.Maximum == nil && a4bdata.Average == nil && a4bdata.Median == nil;
let a4 = a4a && a4b;

我不知道从哪里开始解决问题并将 exam-block 变为 true。

最佳答案

伙计,如果你必须在 Swift 中这样做,请用大写字母声明类,用小写字母声明变量,函数以小写字母开头。

class Statistic {

    var minimum: Int?
    var maximum: Int?
    var average: Double?
    var median: Double?
}

停止检查数组数量

if input.count == 0 {
    return nil
}

并使用优化

if input.isEmpty {
    return nil
}

甚至更快

guard !input.isEmpty else { return nil }

您可能将 Statistic 类中声明为 Double 的中值与声明为 Int 的中值函数的输出混合在一起?

试试这个。在这里和那里做了一些事情,它可以做得更好,所以试着多清理一下。有改进的余地。

    struct Statistic {

        var minimum: Int?
        var maximum: Int?
        var average: Double?
        var median: Int?
    }

    func summFunc(input input: [Double]) -> Double? {

        guard !input.isEmpty else { return nil }

        return input.reduce(0, +)
    }

    func averageFunc(input input: [Double]) -> Double? {

        guard !input.isEmpty else { return nil }

        var sum = summFunc(input: input)

        return sum! / Double(input.count)
    }

    func minimumFunc(input input: [Int]) -> Int? {

        guard !input.isEmpty else { return nil }

        return input.minElement()
    }

    func maximumFunc(input input: [Int]) -> Int? {

        guard !input.isEmpty else { return nil }

        return input.maxElement()
    }

    func sortFunc(input input: [Int]) -> [Int] {
        return input.sorted { $0 < $1 }
    }

    func medianFunc(input input: [Int]) -> Int? {

        guard !input.isEmpty else { return nil }

        var median = sortFunc(input: input)
        let medi = input.count
        let me = medi/2

        return median[me]
    }

    func determineStatistics(_ input:[Int]) -> Statistic {

        return Statistic(minimum: minimumFunc(input: input),
                         maximum: maximumFunc(input: input),
                         average: averageFunc(input: input.map { Double($0) } ),
                         median: medianFunc(input: input))
    }

    let a4adata = determineStatistics([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    let a4a = a4adata.minimum == 1 && a4adata.maximum == 10 && a4adata.average == 5.5 && a4adata.median == 6

    let a4bdata = determineStatistics([])
    let a4b = a4bdata.minimum == nil && a4bdata.maximum == nil && a4bdata.average == nil && a4bdata.median == nil
    let a4 = a4a && a4b

而且我使用了 struct 而不是 class,所以我不必编写初始化程序。可能有更多的 var 可以更改为 let。

关于swift - 用一个函数返回几个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249294/

相关文章:

c++ - 如何对类的 const 实例使用打印运算符?

c++ - 打印对象数组的每个元素时出现问题

ios - Swift 微调器/选择器不保存或显示整数

ios - (Swift) 在我的位置 MapKit 内设置一个 1 公里的半径

c++ - 动态数组和函数

oop - 什么是方法、属性和功能?

c# - 获取数据行到 C# 对象

iOS UITableViewCell 异步图像下载和使用自动布局相应地更改 UITableView 高度

ios - 如何更改 TableView 中单元格删除动画的持续时间?

c - 从 main 返回指针