A protocol defines a set of methods, properties, and requirements which should be fulfilled by a class, structure, or enumeration type. The interface defined by the protocol should be implemented by the types, which conform to the protocol. The interface is a public one because all methods and properties in the protocol are public, even though there is no explicit visibility modifier. (For more information, read more about the visibility levels.)
We can think of protocols as types of contracts to be followed. Once you sign a contract (conform to a protocol), then you meet certain requirements and then you can be picked for certain actions.
The definition of a protocol is pretty close to what we know when defining a class, structure, or enumeration type:
protocol CustomContractProtocol {
// list of all requirements (methods or properties)
}