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])
 |