快速关闭省略示例?

问题描述:

当我读到由苹果公司提供的斯威夫特文档时,我发现了一些概念,我不清楚......快速关闭省略示例?

当一个封闭的类型是已知的,如回调委托,则可以省略类型其参数,返回类型或两者。单语句闭包隐式返回其唯一语句的值。

let mappedNumbers = numbers.map({ number in 3 * number }) 
print(mappedNumbers) 

这是什么意思为代表的回调?你能举个例子吗?如果两者都被忽略,我们是否需要in关键字?

没有什么比这更简单的了。在这种情况下,delegate的含义是闭包被用作变量。请看下面的例子:

class Downloader { 
    var onDownloaded: ((Data) -> Void)? 
    func startDownloading() { 
     ... 
    } 
} 

用作:

let downloader = Downloader() 
downloader.onDownloaded = { data in 
    print("Downloaded: \(data.count) B") 
} 
downloader.startDownloading() 

正如你所看到的,我没有不指定类型或在封闭的返回值,因为表达式的左侧( .onDownloaded =)提供了它们。

这同样适用于方法的参数:

func startDownloading(onDownloaded: ((Data) -> Void)?) { 
    ... 
} 

但是,我们仍然需要in在封闭。关键字将参数名称与封闭体分开。当然,我们可以使参数匿名:

downloader.onDownloaded = { 
    print("Downloaded: \($0.count) B") 
} 
+0

'下载器。onDownloaded = { print(“Downloadloaded:\(data.count)B”) }'既然** Bool **类型的变量没有被使用,那么它也可以被忽略?编译器知道'data'是** Data **类型的? – user7813604

+1

@ user7813604哦,不,我的错,对不起。你必须明确地使用'_,data in'来省略:) – Sulthan

它声明参数类型可以从委托中推断出来。委托是一种协议,您可以在其中定义方法参数的类型。这意味着,在实现委托方法时,编译器已通过声明的协议了解方法类型。

一个例子:

let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in 
    return one < two 
} 

第一简化有关的参数。类型推理系统可以计算参数的类型在封闭:

let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two } 

返回类型也可以推断出:

let sortedAnimals = animals.sort { (one, two) in return one < two } 

的$ I符号可以替换为参数名:

let sortedAnimals = animals.sort { return $0 < $1 } 

在单个语句关闭中,可以省略return关键字:

let sortedAnimals = animals.sort { $0 < $1 } 

对于字符串,有一个比较功能,这使得字符串比较更短:

let sortedAnimals = animals.sort(<) 

每一步输出相同的结果,它是由你来决定什么是简洁的,但在同一时间读取。

+0

所以你一直省略'animals.sort()'的括号吗? – user7813604