Faits :
A.
Par jugement du 3 août 2018, le Tribunal correctionnel de l'arrondissement de Lausanne a condamné X._, pour blanchiment d'argent qualifié, infraction grave et contravention à la LStup, infractions à la LEI (LEtr jusqu'au 31 décembre 2018), à une peine privative de liberté de 4,5 ans ainsi qu'à une amende de 300 francs. Il a en outre ordonné son expulsion du territoire suisse pour une durée de dix ans.
B.
Par jugement du 30 novembre 2018, la Cour d'appel pénale du Tribunal cantonal du canton de Vaud a rejeté l'appel formé par X._ contre ce jugement et a intégralement confirmé celui-ci.
Il en ressort notamment ce qui suit.
B.a. X._ est né en 1989 en République de Guinée, pays dont il est ressortissant. Il a déclaré être le père de deux enfants, dont un garçon qui serait gravement malade. L'argent envoyé en Afrique aurait été principalement destiné à payer le traitement et les médicaments de ce fils.
B.b. A A._, durant ses séjours en Suisse entre 2009 et le 4 septembre 2017, X._ s'est livré à un trafic de cocaïne. Il a vendu une quantité brute d'au moins 2,68 kg, pour un total de 652,08 g de cocaïne pure. Il s'apprêtait en outre à vendre 141,3 g, soit 86,5 g purs, de cette drogue lors de la perquisition de son domicile.
B.c. Entre 2009 et le 4 septembre 2017, le prénommé a envoyé au moins 91'860 fr. à l'étranger. Cet argent provenait en très grande partie de son trafic de drogue.
B.d. Entre 2012 et le 4 septembre 2017, X._ a pénétré et séjourné en Suisse à de très nombreuses reprises, alors qu'il n'était titulaire d'aucune autorisation de séjour, sa demande d'asile ayant été rejetée et son renvoi prononcé le 28 février 2003.
B.e. Entre le 28 mai 2015 et le 4 septembre 2017, le prénommé a consommé occasionnellement de la cocaïne, à raison d'une fois toutes les deux semaines en moyenne.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement du 30 novembre 2018, en concluant, avec suite de frais et dépens, principalement à sa réforme en ce sens qu'il est libéré des chefs de prévention de blanchiment d'argent qualifié, d'infraction et de contravention à la LEI, qu'il est constaté que la quantité de cocaïne vendue n'excède pas 1'807 g et qu'il est condamné à une peine privative de liberté ne dépassant pas deux ans, avec sursis. Subsidiairement, il conclut à son annulation et au renvoi de la cause à l'autorité précédente pour nouvelle décision. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire.
Considérant en droit :
1.
Le recourant reproche à la cour cantonale d'avoir violé les art. 400 al. 1 et 404 al. 1 CPP en refusant d'entrer en matière sur certains de ses griefs.
1.1. Aux termes de l'art. 399 al. 3 CPP, la partie qui annonce l'appel adresse une déclaration d'appel écrite à la juridiction d'appel dans les 20 jours à compter de la notification du jugement motivé. Dans sa déclaration, elle indique si elle entend attaquer le jugement dans son ensemble ou seulement sur certaines parties (let. a), les modifications du jugement de première instance qu'elle demande (let. b), ses réquisitions de preuves (let. c). L'al. 4 de cette disposition indique que quiconque attaque seulement certaines parties du jugement est tenu d'indiquer dans la déclaration d'appel, de manière définitive, sur quelles parties porte l'appel, à savoir notamment la question de la culpabilité, le cas échéant en rapport avec chacun des actes (let. a).
Selon l'art. 400 al. 1 CPP, si la déclaration d'appel n'indique pas précisément les parties du jugement de première instance qui sont attaquées, la direction de la procédure de la juridiction d'appel invite la partie à préciser sa déclaration et lui fixe un délai à cet effet.
L'art. 404 al. 1 CPP dispose que la juridiction d'appel n'examine que les points attaqués du jugement de première instance.
La limitation de l'appel repose sur un souci d'économie du procès et d'allègement de la procédure. Après que l'objet de l'appel a été fixé dans la déclaration d'appel, la portée de celui-ci ne peut plus être élargie (arrêt 6B_1160/2017 du 17 avril 2018 consid. 1.1 et les références citées).
1.2. L'autorité précédente a exposé que le recourant avait conclu, à l'issue de la plaidoirie de son défenseur, à sa libération des chefs de prévention de blanchiment d'argent et d'infractions à la LEI, alors que, dans sa déclaration d'appel, l'intéressé avait précisé contester uniquement l'ampleur du trafic de stupéfiants, les montants retenus à titre de blanchiment d'argent ainsi que la quotité de la peine. Le recourant n'avait nullement contesté sa condamnation pour infractions à la LEI, de sorte que la conclusion prise sur ce point lors de l'audience d'appel était irrecevable. S'agissant du blanchiment d'argent, le recourant avait uniquement contesté l'origine criminelle d'une partie des montants envoyés à l'étranger tandis que, lors de l'audience d'appel, celui-ci avait indiqué ne pas être l'auteur d'une partie des transactions litigieuses. Le recourant avait pourtant admis, dans sa déclaration d'appel, que le chef de prévention de blanchiment d'argent pouvait être retenu à son encontre, à tout le moins pour la moitié de la somme totale envoyée. Sa conclusion tendant à son acquittement était donc également irrecevable.
1.3. En l'espèce, dans sa déclaration d'appel motivée du 5 septembre 2018 (cf. pièce 56/1 du dossier cantonal), le recourant a indiqué qu'il reconnaissait "une grande partie des faits", en particulier les entrées et séjours illégaux en Suisse entre 2012 et le 4 septembre 2017, en précisant avoir "pénétré et séjourné à plusieurs reprises, durant plusieurs mois en Suisse, alors même qu'il savait ne pas être en possession d'une autorisation de séjour". Il a aussi admis les faits concernant sa consommation de cocaïne. Il a en outre indiqué reconnaître "s'être livré à un trafic", ainsi qu'avoir "envoyé à l'étranger, à des proches, de l'argent provenant du trafic". L'intéressé a ensuite précisé qu'il contestait l'"ampleur du trafic de stupéfiants", les "montants retenus à titre de blanchiment d'argent, admettant que seule une partie des montants envoyés provenait du trafic de stupéfiants", ainsi que la quotité de la peine. Il a ensuite développé ses moyens, en limitant son argumentation aux questions de la quantité de stupéfiants concernée, des montants provenant du trafic envoyés à l'étranger et de quotité de la sanction.
1.4. Il découle de ce qui précède que, dans sa déclaration d'appel, le recourant n'a pas entendu contester les infractions à la LEI, chef de prévention auquel il n'a consacré aucun grief dans sa déclaration d'appel motivée. En outre, dès lors que le recourant a indiqué qu'il reconnaissait les faits fondant les entrées et séjours illégaux en Suisse, on comprend qu'il ne contestait pas leur qualification juridique, contrairement à ce qu'il soutient devant le Tribunal fédéral. Durant les débats d'appel, le défenseur du recourant a d'ailleurs annoncé qu'il modifiait ses conclusions, en demandant la "mise à néant des chiffres I, II, IV et V du jugement" de première instance (cf. jugement attaqué, p. 6). Il convient donc de considérer que le recourant a, conformément à l'art. 399 al. 4 let. a CPP, limité son appel en ne contestant pas sa culpabilité concernant les actes ayant fondé sa condamnation pour infractions à la LEI.
Compte tenu de l'absence de toute ambiguïté s'agissant de la non-remise en cause, par le recourant, de sa condamnation pour infractions à la LEI dans le cadre de la procédure d'appel, la cour cantonale n'avait pas à inviter celui-ci à préciser sa déclaration sur la base de l'art. 400 al. 1 CPP.
Le recourant n'a pas valablement contesté sa condamnation pour infractions à la LEI devant l'autorité précédente, laquelle n'a pas examiné de griefs à cet égard. Partant, les griefs de l'intéressé portant sur ces infractions sont irrecevables, faute d'épuisement des instances cantonales sur ce point (cf. art. 80 al. 1 LTF).
1.5. A propos de l'infraction de blanchiment d'argent qualifié, le recourant a, dans sa déclaration d'appel motivée, contesté une partie des faits retenus à sa charge par le tribunal de première instance. Dès lors que la question de sa culpabilité en rapport avec cette infraction faisait l'objet de la procédure d'appel, celui-ci pouvait, durant les débats d'appel, faire valoir tout argument y relatif. La cour cantonale jouissait ainsi d'un plein pouvoir d'examen sur cet aspect du jugement, qu'elle devait revoir librement (cf. art. 398 al. 2 CPP).
Devant le Tribunal fédéral, le recourant précise que, durant les débats d'appel, il a contesté sa condamnation pour blanchiment d'argent qualifié en faisant valoir qu'il aurait envoyé de l'argent à sa famille pour entretenir celle-ci et non pour cacher les fonds.
Il ressort du jugement attaqué que la cour cantonale, en traitant les griefs soulevés par le recourant dans sa déclaration d'appel motivée, a examiné si et dans quelle mesure celui-ci devait être condamné pour le chef de prévention en question. Elle n'a donc pas violé le droit fédéral à cet égard. Le recourant a quant à lui pu contester l'infraction concernée devant l'autorité précédente puis critiquer sa condamnation devant le Tribunal fédéral, ses griefs pouvant, sur ce point, être examinés (cf. consid. 2.3 et 3 infra).
2.
Le recourant reproche à la cour cantonale d'avoir établi les faits de manière arbitraire.
2.1. Le Tribunal fédéral n'est pas une autorité d'appel, auprès de laquelle les faits pourraient être rediscutés librement. Il est lié par les constatations de fait de la décision entreprise (art. 105 al. 1 LTF), à moins qu'elles n'aient été établies en violation du droit ou de manière manifestement inexacte au sens des art. 97 al. 1 et 105 al. 2 LTF, à savoir, pour l'essentiel, de façon arbitraire au sens de l'art. 9 Cst. Une décision n'est pas arbitraire du seul fait qu'elle apparaît discutable ou même critiquable; il faut qu'elle soit manifestement insoutenable et cela non seulement dans sa motivation mais aussi dans son résultat (ATF 143 IV 241 consid. 2.3.1 p. 244). En matière d'appréciation des preuves et d'établissement des faits, il n'y a arbitraire que lorsque l'autorité ne prend pas en compte, sans aucune raison sérieuse, un élément de preuve propre à modifier la décision, lorsqu'elle se trompe manifestement sur son sens et sa portée, ou encore lorsque, en se fondant sur les éléments recueillis, elle en tire des conclusions insoutenables (ATF 143 IV 500 consid. 1.1 p. 503; 140 III 264 consid. 2.3 p. 266 et les références citées). Le Tribunal fédéral n'examine la violation de droits fondamentaux que si ce moyen est invoqué et motivé par le recourant de manière précise (art. 106 al. 2 LTF), c'est-à-dire s'il a été expressément soulevé et exposé de manière claire et détaillée. Les critiques de nature appellatoire sont irrecevables (ATF 142 III 364 consid. 2.4 p. 368 et les références citées).
2.2. La cour cantonale a exposé que, durant une période d'environ neuf années, le recourant avait envoyé, depuis la Suisse vers l'étranger, notamment dans des pays africains, 91'860 fr. au total, en utilisant à 347 reprises les services de plusieurs agences de transfert d'argent. L'intéressé admettait avoir fait commerce de la cocaïne durant les années en question et en avoir exporté les bénéfices, mais affirmait qu'une partie des montants concernés avait une provenance licite. Ses assertions n'étaient étayées par aucun élément au dossier, alors que les activités alléguées de serveur en Espagne, de vendangeur en Belgique, de joueur gagnant aux jeux d'argent à A._ et de bénéficiaire de prêts concédés par des membres de sa famille ou des amis auraient dû laisser des traces écrites. Lors de sa première audition, le recourant avait déclaré qu'il travaillait de temps en temps en Belgique et que, pour le surplus, il était entretenu par son amie, ce qui ne devait guère lui permettre de réaliser des économies. Il avait par ailleurs déclaré qu'il souffrait de douleurs qui l'empêchaient de travailler et qu'il n'avait aucune ressource, au point de ne pas pouvoir manger durant plusieurs jours, sauf à compter sur l'aide de son amie. Selon l'autorité précédente, il était très peu vraisemblable que le recourant eût amené en Suisse le produit de son travail en Espagne ou en Belgique pour le ventiler ensuite, de manière onéreuse, à l'occasion de multiples envois dans d'autres pays, notamment ceux où ces gains auraient été réalisés. Sur ce point, l'intéressé s'était d'ailleurs contredit lors de l'audience d'appel, en déclarant qu'il n'avait jamais amené en Suisse de l'argent gagné légalement dans d'autres pays afin de l'expédier à l'étranger. Tout l'argent envoyé depuis la Suisse vers l'étranger était donc de provenance illicite, hormis éventuellement celui obtenu grâce à de supposés gains de jeux d'argent ou à des prêts, ce qui était particulièrement douteux. En effet, l'existence de gains réguliers au jeu, non annihilés par des pertes, pour un joueur d'habitude, n'était pas crédible, non plus que celle de prétendus prêts, non établis et a priori jamais remboursés. Si le recourant avait peut-être acheté, exporté en Afrique et vendu quelques voitures, ces opérations avaient été trop peu fréquentes pour justifier les sommes envoyées à l'étranger. Le recourant avait déclaré à la police avoir envoyé environ sept voitures depuis la Suisse à destination de la Guinée, depuis 2009 environ et jusqu'en 2017. Lors de l'audience d'appel, il avait toutefois indiqué qu'il aurait envoyé jusqu'à sept voitures par année à l'étranger, en précisant qu'il lui serait arrivé de réaliser un bénéfice de 5'000 fr. en revendant un véhicule en Afrique, ce qui paraissait élevé au vu des frais envisageables. En admettant même que le recourant eût vendu sept voitures en réalisant un tel bénéfice, celui-ci aurait obtenu un gain de 325 fr. par mois au maximum, ce qui aurait été insuffisant pour vivre en Suisse tout en transférant de l'argent à l'étranger. En outre, en 2017, le recourant avait assumé seul un loyer mensuel de 1'000 francs. Il disposait de trois téléphones, devait assumer des frais de transport, de vêtements et de nourriture, tout en étant consommateur de drogue et de jeux d'argent. Il avait donc eu un train de vie bien supérieur à celui que les revenus qu'il avait prétendu avoir réalisés par la vente de voitures lui auraient permis d'assumer. La cour cantonale a ajouté que, durant son audition du 2 février 2018, le recourant avait fini par admettre que la totalité de ses envois d'argent à l'étranger provenaient du trafic de cocaïne, en reconnaissant que ses allégations concernant de prétendus revenus licites n'étaient pas crédibles.
S'agissant de l'ampleur du trafic de stupéfiants auquel s'est livré le recourant, la cour cantonale a indiqué que la quantité brute de 2,68 kg résultait notamment des ventes admises auprès de deux consommateurs et, pour le reste, de la transposition de 90'365 fr. blanchis - deux versements vers l'étranger ayant été retranchés de la somme de 91'860 fr. -, additionnés à 800 fr. mensuels pour assurer l'entretien de l'intéressé durant 55 mois, divisés par 50 fr., ce qui correspondait au bénéfice réalisé par gramme vendu. A ces quantités vendues s'ajoutaient 141,3 g de cocaïne trouvés lors de la perquisition de son appartement et destinés à la vente.
2.3. Le recourant soutient que la cour cantonale aurait retenu, de manière contradictoire, que son quotidien en Suisse aurait été assuré par des gains licites, tout en indiquant que l'intéressé devait gagner mensuellement - par le trafic de stupéfiants - quelque 800 fr. pour subvenir à ses besoins. Cet argument résulte d'une lecture biaisée du jugement attaqué. S'agissant de revenus licites en Suisse, la cour cantonale a discuté les explications successives contradictoires livrées par le recourant. Elle a notamment relevé que de tels gains ne pouvaient provenir, de manière régulière, de jeux d'argent. A propos de la vente de véhicules en Afrique, l'autorité précédente a indiqué que les déclarations de l'intéressé avaient varié et que les opérations évoquées n'auraient de toute manière nullement permis de réaliser un chiffre d'affaires correspondant aux montants impliqués dans les envois de fonds à l'étranger. La cour cantonale a ajouté que le recourant avait fini par admettre que la totalité des envois d'argent à l'étranger impliquaient de l'argent provenant du trafic de stupéfiants. En définitive, l'autorité précédente n'a aucunement retenu que le recourant aurait assuré son quotidien grâce à des revenus licites, mais a relevé que quelques gains éventuels de cette nature - dont elle n'a au demeurant pas retenu l'existence - auraient de toute manière été consommés en Suisse et non envoyés à l'étranger. Par ailleurs, elle a considéré, dans son calcul relatif aux quantités de drogue écoulées, une somme pour vivre en Suisse de 800 fr. par mois, laquelle est inférieure au seul loyer que devait payer le recourant en 2017 et ne couvrait ainsi pas tous ses besoins. On ne voit pas quelle constatation insoutenable résulterait de ces diverses considérations.
Le recourant soutient encore qu'il n'aurait pas envoyé de l'argent à l'étranger pour le dissimuler, mais pour entretenir sa famille. Il ressort de l'état de fait de la cour cantonale que celle-ci a pris note des explications de l'intéressé - selon lesquelles l'argent envoyé en Afrique aurait été principalement destiné à payer le traitement et les médicaments de son fils - sans pour autant en retenir la véracité. On comprend du jugement attaqué que, selon l'autorité précédente, l'argent litigieux n'était pas destiné à un tel usage, puisqu'il n'a pas été envoyé systématiquement au même endroit, mais dans divers pays d'Afrique. Quoi qu'il en soit, la correction d'un éventuel vice à cet égard ne serait pas susceptible d'influer sur le sort de la cause (cf. art. 97 al. 1 LTF), en raison de ce qui suit.
3.
Le recourant conteste sa condamnation pour blanchiment d'argent qualifié, en soutenant que les sommes envoyées à l'étranger auraient servi à entretenir sa famille.
Aux termes de l'art. 305bis ch. 1 CP, celui qui aura commis un acte propre à entraver l'identification de l'origine, la découverte ou la confiscation de valeurs patrimoniales dont il savait ou devait présumer qu'elles provenaient d'un crime ou d'un délit fiscal qualifié, sera puni d'une peine privative de liberté de trois ans au plus ou d'une peine pécuniaire. L'infraction de blanchiment est intentionnelle, le dol éventuel étant suffisant. L'auteur doit vouloir ou accepter que le comportement qu'il choisit d'adopter soit propre à provoquer l'entrave prohibée. Au moment d'agir, il doit s'accommoder d'une réalisation possible des éléments constitutifs de l'infraction (ATF 122 IV 211 consid. 2e p. 217; 119 IV 242 consid. 2b p. 247; arrêt 6B_659/2014 du 22 décembre 2017 consid. 15.2.3).
En l'espèce, à supposer même que - comme le soutient le recourant - l'argent envoyé à l'étranger aurait eu pour principal but d'entretenir sa famille, cela n'aurait en rien modifié la qualification juridique des faits, puisque l'intéressé, qui connaissait l'origine criminelle des fonds concernés, a entravé, au moyen des envois litigieux, la découverte ou la confiscation des valeurs patrimoniales en question. Le grief doit ainsi être rejeté.
4.
Le recours doit être rejeté. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (art. 64 al. 1 LTF). Le recourant, qui succombe, supportera les frais judiciaires (art. 66 al. 1 LTF), dont le montant sera fixé en tenant compte de sa situation financière, laquelle n'apparaît pas favorable.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénale du Tribunal cantonal du canton de Vaud.
Lausanne, le 5 mars 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa