Weak' must not be applied to non-class-bound consider adding a protocol conformance that has a class bound
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
In Swift, when using the keyword weak
, you may come across a specific warning or error: "Weak' must not be applied to non-class-bound; consider adding a protocol conformance that has a class bound". This message appears when you attempt to declare a weak reference to a protocol type that is not constrained to class (reference type) instances only.
Understanding the concept of memory management, and specifically how weak
references help prevent retain cycles, is integral to solving this issue. In this detailed article, we'll explore why this error occurs, how to fix it, and provide relevant technical explanations and examples.
Understanding Memory Management in Swift
Swift uses Automatic Reference Counting (ARC) to manage memory usage. When an instance of a class is created, Swift allocates a portion of memory to store that instance. ARC tracks the number of references to each class instance and deallocates it once there are no more strong references.
Strong, Weak, and Unowned References
- Strong References: These are the default. Every new class instance has at least one strong reference. This keeps the instance alive in memory for as long as the strong reference exists.
- Weak References: These do not increase the reference count, helping prevent retain cycles, particularly in a parent-child relationship (e.g., a delegate pattern). Weak references must always be optional (
weak var) and automatically becomenilonce the instance they point to is deallocated. - Unowned References: These assume that they will never reference a
niland are used when both instances have the same lifecycle.
Why the Error Occurs
The error "Weak' must not be applied to non-class-bound" occurs because Swift requires weak references to be applied only to classes (reference types), not to value types (like structs or enums) or protocol types unless the protocol is explicitly constrained to be class-only.
Protocol Conformance
If your protocol does not explicitly conform to any reference type, and you attempt to use a weak
reference for it, Swift throws this error. This is a critical aspect because weak references are only meaningful for class instances due to the nature of ARC.
Fixing the Error
To fix the error, you will need to apply class conformance to your protocol declaration. Let's delve into technical execution.
Example Without Class Conformance
Here’s an example that leads to this error:
- **Use Cases for
weak**: Delegation is a quintessential usage ofweakto prevent a strong reference cycle between the delegate and the object it's managing. - Optional Protocols: Always declare weak properties as optional, since they have the potential to be
nil. - Class Constraint: This solution only applies to classes and protocols constrained with
AnyObject, making it suitable for cases where ARC benefits are required. - Retain Cycles: Issues occur when two or more instances hold strong references to each other, preventing ARC from deallocating any of them. Weak and unowned references help mitigate this.
- Value Types: Swift
structsandenumsalways have strong references by their nature, as they don’t handle memory management through ARC due to being value types. Thus,weakis irrelevant here.

