我正试图让我的头周围创建闭包。我得到更简单的,比如:
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