Por qué no se puede usar el protocolo `Encodable` como tipo en el func

Estoy tratando de obtener datos por modelo de codificación que se ajusta aEncodable protocolo. Pero no ha podido invocar funcencode como código a continuación:

// MARK: - Demo2

class TestClass2: NSObject, Encodable {
    var x = 1
    var y = 2
}


var dataSource2: Encodable?

dataSource2 = TestClass2()

// error: `Cannot invoke 'encode' with an argument list of type '(Encodable)'`
let _ = try JSONEncoder().encode(dataSource2!)
//func encode<T>(_ value: T) throws -> Data where T : Encodable

Pero en otra demostración, funciona bien, ¿por qué?

// MARK: - Demo1

protocol TestProtocol {
    func test()
}

class TestClass1: NSObject, TestProtocol {
    func test() {
        print("1")
    }

    var x = 1
    var y = 2
}


var dataSource1: TestProtocol?

dataSource1 = TestClass1()


func logItem(_ value: TestProtocol) {
    value.test()
}

logItem(dataSource1!)

Respuestas a la pregunta(3)

Su respuesta a la pregunta