第47月第18天 swift函数调用 参数
1.
2020 斯坦福(Stanford)Swift 语言教程
https://www.bilibili.com/video/BV1EV411C77B?p=2
https://github.com/Sophia-fez/Standford-CS193p-2020Spring-SwiftUI
BBCo - iOS开发入门教程 SwiftUI 微博App项目实战
https://github.com/xiaoyouxinqing/PostDemo
2.
func sessionLoadData(){ //创建URL对象 let urlString = "http://hangge.com" let url = URL(string:urlString) //创建请求对象 let request = URLRequest(url: url!) let session = URLSession.shared let dataTask = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in if error != nil{ print(error.debugDescription) }else{ let str = String(data: data!, encoding: String.Encoding.utf8) print(str) } }) as URLSessionTask //使用resume方法启动任务 dataTask.resume() }
https://www.jianshu.com/p/6ca4864b3600
闭包表达式作为回调函数
尾随闭包
如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,将这个闭包替换成为尾随闭包的形式很有用。尾随闭包是一个书写在函数圆括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你不用写出它的参数标签:
URLSession.shared.dataTask(with: url) { (data, response, error) in if error == nil { print("请求成功\(String(describing: response))" ) } }.resume()
https://juejin.im/post/6844903920746102798
swift5
SE-0235 在标准库中引入了全新的 Result 类型,它让我们能够更加方便清晰地在复杂的代码中处理 error,例如异步 API。 Swift 的 Result 类型是用枚举实现的,其中包含了 success 和 failure。它们两者都使用泛型,因此你可以为它们指定任意类型。但是 failure 必须遵循 Swift 的 Error 协议。 为了进一步演示 Result,我们可以写一个网络请求函数来计算用户有多少未读消息。在此示例代码中,我们将只有一个可能的错误,即请求的字符串不是有效的 URL: enum NetworkError: Error { case badURL } 复制代码fetch 函数将接受 URL 字符串作为其第一个参数,并将 completion 闭包作为其第二个参数。该 completion 闭包本身将接受一个 Result,其中 success 将存储一个整数,failure 将是某种 NetworkError。我们实际上并没有在这里连接到服务器,但使用 completion 闭包可以让我们模拟异步代码。 代码如下: import Foundation func fetchUnreadCount1(from urlString: String, completionHandler: @escaping (Result<Int, NetworkError>) -> Void) { guard let url = URL(string: urlString) else { completionHandler(.failure(.badURL)) return } // 此处省略复杂的网络请求 print("Fetching \(url.absoluteString)...") completionHandler(.success(5)) } 复制代码要调用此函数,我们需要检查 Result 中的值来看看我们的请求是成功还是失败,代码如下: fetchUnreadCount1(from: "https://www.hackingwithswift.com") { result in switch result { case .success(let count): print("\(count) 个未读信息。") case .failure(let error): print(error.localizedDescription) } } 复制代码在开始在自己的代码中使用 Result 之前,你还有三件事应该知道。 首先,Result 有一个 get() 方法,如果存在则返回成功值,否则抛出错误。这允许你将 Result 转换为常规会抛出错误的函数调用,如下所示: fetchUnreadCount1(from: "https://www.hackingwithswift.com") { result in if let count = try? result.get() { print("\(count) 个未读信息。") } } 复制代码其次,Result 还有一个接受抛出错误闭包的初始化器:如果闭包返回一个成功的值,用于 success 的情况,否则抛出的错误则被传入 failure。 举例: let result = Result { try String(contentsOfFile: someFile) } 复制代码第三,你可以使用通用的 Error 协议而不是你创建的特定错误的枚举。实际上,Swift Evolution 提议说道“预计 Result 的大部分用法都会使用 Swift.Error 作为 Error 类型参数。” 因此你要用 Result 而非 Result。这虽然意味着你失去了可抛出错误类型的安全性,但你可以抛出各种不同的错误枚举,其实这取决于你的代码风格。
https://developer.aliyun.com/article/716433