47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Generics
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Generics
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Write a name inside angle brackets to make a generic function or type.
							 | 
						||
| 
								 | 
							
								```Swift
							 | 
						||
| 
								 | 
							
								func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
							 | 
						||
| 
								 | 
							
									var result = [Item]()
							 | 
						||
| 
								 | 
							
									for _ in 0..<numberOfTimes {
							 | 
						||
| 
								 | 
							
										result.append(item)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return result
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								makeArray(repeating: "knock", numberOfTimes: 4)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								***You can make generic forms of functions and methods, as well as classes, enumerations, and structures.***
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```Swift
							 | 
						||
| 
								 | 
							
								// Reimplement the Swift standard library's optional type
							 | 
						||
| 
								 | 
							
									enum OptionalValue<Wrapped> {
							 | 
						||
| 
								 | 
							
										case none
							 | 
						||
| 
								 | 
							
										case some(Wrapped)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									var possibleInteger: OptionalValue<Int> = .none
							 | 
						||
| 
								 | 
							
									possibleInteger = .some(100)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Use  `where`  right before the body to specify a list of requirements—for example, to require the type to implement a protocol, to require two types to be the same, or to require a class to have a particular superclass.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```swift
							 | 
						||
| 
								 | 
							
								func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
							 | 
						||
| 
								 | 
							
								where T.Element: Equatable, T.Element == U.Element
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									for lhsItem in lhs {
							 | 
						||
| 
								 | 
							
										for rhsItem in rhs {
							 | 
						||
| 
								 | 
							
											if lhsItem == rhsItem {
							 | 
						||
| 
								 | 
							
											return true
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								return false
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								anyCommonElements([1, 2, 3], [3])
							 |