创建更复杂的闭包时遇到麻烦



我正试图让我的头周围创建闭包。我得到更简单的,比如:

let squaredNumber = { (num: Int) -> (Int) in 
return num * num
}
print( squaredNumber(9) ) // 81

和我理解排序是如何工作的:

let team = ["Bob", "Rick", "Peter"]
print( team.sorted() ) // ["Bob", "Peter", "Rick"]
print( team.sorted(by: { $0 > $1 }) ) //["Rick", "Peter", "Bob"]

所以现在我试着创建我自己的排序1版本,在设置方面。

在排序函数中,有一个普通函数sorted()和一个sorted(by:...)选项。到目前为止,我正在玩的代码是(注释代码只是玩玩):

struct Person {

let name_given = { (fn: String?, ln: String?) -> String in

//         return a different value if a nil is supplied
guard let fn1 = fn else { return "No First Name" }
guard let ln1 = ln else { return "No Last Name" }

//         Only returns value if not nil
//        if let fn1 = fn { return fn1 }
//        if let ln1 = ln { return ln1 }

// returns what has been decided above
return "(fn!) (ln!)"
}
let no_name = {() -> String in 
return "Hello"
} 
}
let dad = Person()
print( dad.name_given("Jeff", "Smith") )
print( dad.no_name() )

,但我只能得到这个工作dad.something(),但我想在一个函数的参数闭包的选项,我猜一个可选的。

我想得对吗?

基本上,我想创建一个函数,根据是否有参数来执行不同的代码。

比如dad()dad(name: {"Jeff", "Smith"})dad(age: {35})

闭包将组合字符串或对代码执行某些操作,然后返回结果或其他操作。

上面的代码没有故事,我只是想了解如何创建它。

/////////////////

为清晰编辑:

所以我意识到我的目标被解释得很混乱,因为我正试图弄清楚这一点。

这里有一个更好的尝试:

所以这段代码仍然不能工作,但是请告诉我。

举个例子:

static func closure(both: (_ a: String, _ b: String) -> String { a, b in
return "(a) (b)"
})

然后是这个:

static func closure(single: (_ a: String) -> String { a in
return "(a)"
})

那么我就可以这样做了

Person.closure(both: {"First", "Last"}) -> This would output "First Last"

Person.closure(single: {"First"}) -> This would output "First"

我的结果是我可以有一个静态类,它有一堆闭包,但它们是分组的。

如果我想要一堆字符串类型的闭包,很容易找到它们因为你可以这样做:

StaticStruct.string(<thing1>: {<closure params>})
StaticStruct.string(<thing2>: {<closure params>})
StaticStruct.string(<thing3>: {<closure params>})

或者如果我想处理数字,它会是:

StaticStruct.numbers(<thing1>: {<closure params>})
StaticStruct.numbers(<thing2>: {<closure params>})
StaticStruct.numbers(<thing3>: {<closure params>})

我希望这更有意义。

我喜欢数组排序时的样子,这就是为什么我开始这样想的原因。

你所要求的对于Swift来说是有缺陷的:

如果你什么都不提供,甚至连nil都不提供,Swift怎么知道缺了什么?

思考这个例子:

print( dad.name_given("Connor") )

Swift怎么知道你只提供了名字,还是只提供了姓?在您的示例中,您需要明确什么是而不是提供:

print( dad.name_given(nil, "Connor") )    // Surely only last name is provided

函数可以通过提供默认值来解决这个问题,所以你不必传递nil,但是你需要明确地告诉你传递的是什么,否则Swift会认为:

func person(fn: String? = "", ln: String? = "") -> String {...}
print( dad.person(ln: "Connor"))    // Surely passing the second parameter
func person(_ fn: String? = "", _ ln: String? = "") -> String {...}
print( dad.person("Connor"))   // It will assume that you are passing the first parameter

但是对于闭包,你不能为参数提供默认值:

let name_given = { (fn: String? = "", ln: String? = "") -> String in...}
// Error: Default arguments are not allowed in closures

这可能不能解决您的问题,但是您可以创建一个函数,为参数提供默认值(不需要传递nil),并接受一个闭包来处理这些参数。

func describe(fn: String = "", ln: String = "", _ action: @escaping (String?, String?)->String) -> String {
let first: String? = fn == "" ? nil : fn
let second: String? = ln == "" ? nil : ln
return action(first, second)
}
print( dad.describe(ln: "Connor", dad.name_given))   // No first Name

最新更新