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