第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

 

posted @ 2020-08-18 09:58  lianhuaren  阅读(237)  评论(0编辑  收藏  举报