• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用Swift 4重构代码的8种新方法

由于其优雅、简单和“设计安全”,swift 是历史上发展最快的语言之一。事实上,Swift 的官方口号是“让编程简单的事情变得简单,让困难的事情成为可能”。在这篇文章中,您将学习如何通过重构代码来充分利用 Swift。

虽然许多代码优化是隐含的,并且显然是语言设计中固有的,但有一些重构策略可以使您的代码更具可读性、更可靠和更好的性能。在本文中,您将学习使用 Swift 4 重构代码的八种方法。 

本文的目标 

在本文中,您将学习一些使用 Swift 4 更好地优化和重构代码的方法。我们将介绍以下内容:

  1. 优雅地处理字典中的重复键 zip

  2. 设置字典的默认值

  3. 将字典合二为一

  4. 将数据字典值直接过滤到另一个字典对象中

  5. 使用 Codable 将自定义对象保存到 JSON

  6. 交换可变数组中的值

  7. 处理多行文字

  8. 在集合中查找随机 dom元素

1.字典中的重复键

首先,Swift 4 进一步增强了字典,使用通用函数处理重复键的优雅方式 zip。  zip 不仅仅适用于字典,事实上它可以让你从两个符合 Sequence 的底层集合构建自己的序列类型。 

例如,假设您有一个包含以下值的数组,请注意包含相同键的两个元素:

let locations = [ "Springfield", "Chicago", "Springfield", "Jackson"]
var dictionary: Dictionary<String, String>

通过使用  zip,您可以创建一系列唯一对:

let locations = [ "Springfield", "Chicago", "Springfield", "Jackson"]

var dictionary = Dictionary(zip(locations, repeatElement(1, count: locations.count)), uniquingKeysWith: +)

print(dictionary) // ["Jackson": 1, "Chicago": 1, "Springfield": 2]

上面代码中的 uniquingKeysWith 元素允许您通过使用数学运算符来创建唯一值。在这种情况下, +每当找到重复条目时,我们都会使用递增值。当然,您也可以决定使用自己的自定义增量逻辑。

2. 字典的默认值 

Swift 4 的另一个强大功能是能够使用新添加的下标为字典设置默认值。在下面的代码中,当你访问字典中某个键的值时,返回的值是一个 optional 值,如果该键不存在则返回 nil:

let locationsAndPopulations = [ "Springfield": 115715, "Chicago": 2705000, "Aurora": 201110]
print(locationsAndPopulations["Springfield"]) //value is optional
print(locationsAndPopulations["New York"]) //this key doesn't exist, returns nil

通常你应该处理可选值的可能性 nil ,但是 Swift 4 通过一个允许你添加默认参数的新下标让你更方便一点,而不是强迫你保护或解开可选值。

print(locationsAndPopulations["New York", default: 0])

在这种情况下,由于我们的初始数组中没有 New York 条目,因此它将返回默认参数 0。如果需要,您还可以注入动态值而不是静态文字值,这当然使得一个更强大的下标功能。 

3.合并字典

Swift 4 还可以通过使用 merge(_:uniquingKeysWith:)在下面的示例中,我们将第二个字典合并到第一个字典中,并且通过使用新学习的参数 uniquingKeysWith,我们可以确保在出现重复时进行处理:

var locationsAndPopulationsIL = [ “Springfield”: 115715, “Chicago”: 2705000, “Aurora”: 201110]

let location2 = [ “Rockford”: 152871, “Naperville”: 141853, “Champaign”: 81055]

locationsAndPopulationsIL.merge(location2, uniquingKeysWith: +)
print(locationsAndPopulationsIL)

在没有此功能的情况下,您通常必须手动遍历字典的所有值并实现将两个字典合并为一个的自定义逻辑。 

4.将字典值过滤到另一个字典中

除了合并两个字典之外,您还可以动态过滤一个字典,并将结果定向回另一个相同类型的字典。在接下来的代码片段中,我们按特定值过滤位置字典,以字典形式返回:

let locationsAndPopulationsIL = [ "Springfield": 115715, "Chicago": 2705000, "Aurora": 201110]

let filteredmillionPlusPopulation = locationsAndPopulationsIL.filter{ $0.value > 1000000 }

print(filteredmillionPlusPopulation)  //["Chicago": 2705000]

因此,除了简单的过滤之外,您还可以使用filter闭包来提供自定义过滤器,最终生成一个新的字典结果。 

5.将自定义对象保存为 JSON

如果您以前曾经序列化(和反序列化)数据,那么它可能会非常复杂,必须使用 子类化类 NSObject以及实现 NSCoding使用 Swift 4,您可以通过使用 Codable当您想通过将您的自定义对象序列化为 JSON 对象来进行持久化时,这尤其有用,可以传递给api,甚至可以使用以下方法在本地持久化UserDefaults

// a class to serialize
class Location: Codable{
    var name: String
    var population: Int
    
    init(name: String, population: Int){
        self.name = name
        self.population = population
    }
}

//create an instance
let chicago = Location(name: "chicago", population: 2705000)

//serialize to JSON
let jsondata = try? JSONEncoder().encode(chicago)

//deserialize and output
if let data = jsonData{
    let jsonString = String(data: data, encoding: .utf8)
    print(jsonString!) //{"name":"chicago","population":2705000}

}

如您所见,通过将您的类或结构设置为 Codable,您可以轻松地将数据序列化为 JSON,将数据保存在某处,然后反序列化。 

6.在可变数组中交换值

切换到数组,Swift 4 中另一个受欢迎的特性是能够直接在可变数组中交换两个值,方法是使用 swapAt(_:_:)这对于诸如排序算法之类的功能最有用,并且使用起来非常简单:

var locations = [ "Springfield", "Chicago", "Champaign", "Aurora"]

locations.swapAt(0, 2)
print(locations) //["Champaign", "Chicago", "Springfield", "Aurora"]

以前,您必须使用临时变量在两个元素位置之间进行交换,但使用这种方法,您可以更简洁地对数组进行排序。

7. 处理多行文字

Swift 4 的另一个很酷的新增功能是能够在您的值中存储多行字符串文字,这使得分解文字内容变得更加容易变得非常容易。通过使用符号"""打开和关闭文本块,可以创建多行内容,甚至可以引用动态变量,如下图我们动态添加日期时。

let illinoisIntro = """
Illinois is a state in the Midwestern United States. It is the 5th most 
populous and 25th largest state, and is often noted as a microcosm of 
the country. With Chicago and its suburbs in the northeast, small industrial 
cities and great agricultural productivity in central and northern Illinois, 
and natural resources like coal, timber, and petroleum in the south, Illinois 
has a diverse economic base and is a major transportation hub. 
(Source: Wikipedia - Dated \(Date())
"""
print(illinoisIntro)

8. 在集合中选择随机元素

Swift 4.2中的新 功能是能够使用该randomElement 函数 在集合中选择随机元素。事实上,不只是数组,任何符合 Collection 协议的对象都可以使用这个漂亮的函数。以下示例使用我们的位置数组,它将从该数组中打印出一个随机城市:

let locations = [ "Springfield", "Chicago", "Springfield", "Jackson"]

let randomElement = locations.randomElement()
print(randomElement!)

结论

在本文中,您了解了 Swift 4 带来的一些有用技术,这些技术有助于创建更紧凑、更专注和更优化的代码。在其第四次迭代中,Swift 在帮助您重构代码以使其更具可读性和可靠性方面确实取得了长足的进步。Swift 4.x 还没有完成,我鼓励你关注官方的 Swift 进化 页面,注意所有正在讨论的新提案。 

使用Swift 4重构代码的8种新方法  第1张

文章目录
  • 本文的目标
  • 1.字典中的重复键
  • 2. 字典的默认值
  • 3.合并字典
  • 4.将字典值过滤到另一个字典中
  • 5.将自定义对象保存为 JSON
  • 6.在可变数组中交换值
  • 7. 处理多行文字
  • 8. 在集合中选择随机元素
  • 结论