首页 > 其他分享 >无涯教程-Swift - Generics(泛型)

无涯教程-Swift - Generics(泛型)

时间:2024-01-29 20:31:45浏览次数:18  
标签:tos print 无涯 item Generics items 泛型 Swift

Swift 4语言提供"Generic"函数来编写灵活且可重用的函数和类型,泛型用于避免重复并提供抽象, Swift 4标准库是使用泛型代码构建的。 Swift 4s的"Arrays"和"Dictionary"类型属于Generic集合。

func exchange(a: inout Int, b: inout Int) {
   let temp=a
   a=b
   b=temp
}

var numb1=100
var numb2=200

print("Before Swapping values are:\(numb1) and\(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping values are:\(numb1) and\(numb2)")

运行上述程序时,我们得到以下输出-

Before Swapping values are: 100 and 200
After Swapping values are: 200 and 100

 类型参数

泛型函数可用于访问任何数据类型,如" Int"或" String"。

func exchange<T>(a: inout T, b: inout T) {
   let temp=a
   a=b
   b=temp
}
var numb1=100
var numb2=200

print("Before Swapping Int values are:\(numb1) and\(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are:\(numb1) and\(numb2)")

var str1="Generics"
var str2="Functions"

print("Before Swapping String values are:\(str1) and\(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are:\(str1) and\(str2)")

运行上述程序时,我们得到以下输出-

Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics

函数exchange()用于交换上面程序中描述的值,而<T>用作类型参数。第一次调用函数exchange()返回“ Int”值,第二次调用函数exchange()将返回“ String”值。尖括号内可以包含多个参数类型,以逗号分隔。

类型参数被命名为用户定义,以了解其所持有的类型参数的用途。Swift 4提供<T>作为通用类型参数名称。但是,诸如数组和字典之类的类型参数也可以称为键值,以标识它们属于“字典”类型。

struct TOS<T> {
   var items=[T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }
}

var tos=TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

let deletetos=tos.pop()

运行上述程序时,我们得到以下输出-

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

扩展泛型类型

扩展stack属性以知道项目的顶部包含在'extension'关键字中。

struct TOS<T> {
   var items=[T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }
}
var tos=TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

extension TOS {
   var first: T? {
      return items.isEmpty ? nil : items[items.count - 1]
   }
}
if let first=tos.first {
   print("The top item on the stack is\(first).")
}

运行上述程序时,我们得到以下输出-

["Swift 4"]
["Swift 4", "Generics"]
["Swift 4", "Generics", "Type Parameters"]
["Swift 4", "Generics", "Type Parameters", "Naming Type Parameters"]
The top item on the stack is Naming Type Parameters.

类型约束

Swift 4语言允许"类型约束"指定类型参数是从特定类继承还是确保协议符合标准。

func exchange<T>(a: inout T, b: inout T) {
   let temp=a
   a=b
   b=temp
}
var numb1=100
var numb2=200

print("Before Swapping Int values are:\(numb1) and\(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are:\(numb1) and\(numb2)")

var str1="Generics"
var str2="Functions"

print("Before Swapping String values are:\(str1) and\(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are:\(str1) and\(str2)")

当我们使用游乐场运行上述程序时,我们得到以下输出-

Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics

关联类型

Swift 4允许通过关键字" associatedtype"在协议定义中声明关联类型。

protocol Container {
   associatedtype ItemType
   mutating func append(item: ItemType)
   var count: Int { get }
   subscript(i: Int) -> ItemType { get }
}
struct TOS<T>: Container {
   //原始 Stack<T> 实现
   var items=[T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }
   
   //符合容器协议
   mutating func append(item: T) {
      self.push(item: item)
   }
   var count: Int {
      return items.count
   }
   subscript(i: Int) -> T {
      return items[i]
   }
}
var tos=TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

运行上述程序时,我们得到以下输出-

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

Where 声明

类型约束使用户可以定义对与通用函数或类型关联的类型参数的要求。为了定义关联类型的要求,将" where"子句声明为类型参数列表的一部分。 " where"关键字放置在类型参数列表之后,紧随其后的是关联类型的约束,类型与关联类型之间的相等关系。

protocol Container {
   associatedtype ItemType
   mutating func append(item: ItemType)
   var count: Int { get }
   subscript(i: Int) -> ItemType { get }
}
struct Stack<T>: Container {
   //原始 Stack<T> 实现
   var items=[T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }

   //符合容器协议
   mutating func append(item: T) {
      self.push(item: item)
   }
   var count: Int {
      return items.count
   }
   subscript(i: Int) -> T {
      return items[i]
   }
}
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, anotherContainer: C2) -> Bool {
   //检查两个容器是否包含相同数量的项目
   if someContainer.count != anotherContainer.count {
      return false
   }
   
   //检查每对项目,看看它们是否相等
   for i in 0..<someContainer.count {
      if someContainer[i] != anotherContainer[i] {
         return false
      }
   }
   //所有项目都匹配,所以返回 true
   return true
}  
var tos=Stack<String>()

tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Where Clause")
print(tos.items)

var eos=["Swift 4", "Generics", "Where Clause"]
print(eos)

运行上述程序时,我们得到以下输出-

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]

参考链接

https://www.learnfk.com/swift/swift-generics.html

标签:tos,print,无涯,item,Generics,items,泛型,Swift
From: https://blog.51cto.com/u_14033984/9472611

相关文章

  • 无涯教程-Swift - 类型转换
    为了验证的类型,"TypeCasting"以Swift4语言开始发挥作用,它用于检查类型是属于特定的超类还是子类,或者是否在其自己的层次结构中定义。Swift4类型转换提供两个运算符"is"来检查值的类型和"as",并将类型值转换为其他类型,类型转换还检查类型是否遵循特定的协议一致性标准。类层......
  • 无涯教程-Swift - 引用计数
    内存管理函数及其用法通过自动引用计数(ARC)以Swift4语言处理。ARC用于初始化和取消初始化系统资源,从而在不再需要时释放类使用的内存空间。ARC跟踪有关我们的代码之间的关系的信息,以有效地管理内存资源。ARC函数每次通过init()创建新的类时,ARC每次都会分配一块内存来存储信......
  • 无涯教程-Swift - 解析构造
    在需要释放一个类实例之前,必须调用"deinitializer"来释放内存空间,关键字"deinit"用于取消分配系统资源占用的内存空间。释放内存空间当不再需要实例时,Swift4会自动释放其实例,以释放资源。Swift4通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述。通常,在实例......
  • 无涯教程-Swift - 继承
    通常,一个类可以从另一个类继承方法,属性和函数。类可以进一步分类为子类和父类。子类  - 当一个类从另一个类继承属性,方法和函数时,称为子类父类  - 包含从其自身继承其他类的属性,方法和函数的类称为超类Swift4类包含调用和访问方法,属性,函数和覆盖方法的父类,此外,......
  • 无涯教程-Swift - Subscripts(下标)
    Subscripts下标可以访问类,结构和枚举中的集合,序列和列表的元素成员。这些下标用于在索引的帮助下存储和检索值。在someArray[index]的帮助下访问数组元素,而在Dictionary中的后续成员元素可以作为someDicitonary[key]访问。下标声明语法 "subscript"关键字用于定义,用户可以......
  • 无涯教程-Swift - Method(方法)
    在Swift4语言中,与特定类型关联的函数称为"方法"。在ObjectiveC中,类用于定义方法,而Swift4语言为用户提供了具有类,结构和枚举方法的灵活性。实例方法在Swift4语言中,可通过方法访问Class,Structures和Enumeration。方法可以写在{}花括号内,它具有对类型的方法和属性的隐式访问,......
  • 无涯教程-Swift - Properties(属性)
    Swift4语言为类,枚举或结构提供属性以关联值。存储属性Swift4引入了存储属性的概念来存储常量和变量的,常量的存储属性由'let'关键字定义,变量的存储属性由'var'关键字定义。在定义期间,存储的属性提供"默认值"初始化期间,用户可以初始化和修改初始值structNumber{var......
  • 无涯教程-Swift - Struc(结构)
    Swift4提供了一个灵活的构建块,可以将结构struct用作结构,通过使用这些结构,可以一次定义构造方法和属性。结构语法Structuresaredefinedwitha'Struct'Keyword.structnameStruct{Definition1Definition2---DefinitionN}结构定义如假设我们必须访......
  • 无涯教程-Swift - 集合(Sets)
    Swift4Sets用于存储相同类型的不同值,但它们没有数组的确定顺序,如果要确保没有重复的值,则可以使用Set集合而不是数组。创建Set集您可以使用以下初始化语法创建一个特定类型的空集-varsomeSet=Set<Character>()//字符可以替换为set的数据类型。访问和修改您可以使用......
  • 无涯教程-Swift - 数组
    Swift4数组用于存储相同类型的值的有序列表。如果将创建的数组分配给变量,则它始终是可变的,这意味着您可以通过添加,删除或更改其元素来对其进行更改;但是,如果将数组分配给常量,则该数组是不可变的,并且其大小和内容无法更改。创建数组您可以使用以下初始化器语法创建某种类型的空......