Protocols and generics in Swift allow for polymorphism, sharing of common behaviors and properties, and provide contracts between architecture layers. They help improve testability and allow decoupling of components. Protocols provide static and dynamic dispatch, while generics enable type-level abstraction through constraints and avoid code duplication through abstraction. Associated types and existential types enable value-level abstraction.