Faits :
A.
Par jugement du 30 mai 2018, le Tribunal correctionnel de l'arrondissement de Lausanne a condamné X._, pour infraction grave à la LStup, à une peine privative de liberté de 18 mois, avec sursis durant cinq ans. Il a renoncé à ordonner son expulsion du territoire suisse.
B.
Par jugement du 19 octobre 2018, la Cour d'appel pénale du Tribunal cantonal du canton de Vaud a partiellement admis l'appel formé par le ministère public contre ce jugement et a réformé celui-ci en ce sens que l'expulsion du territoire suisse de X._ est ordonnée pour une durée de sept ans. Elle a confirmé le jugement pour le surplus.
La cour cantonale a retenu les faits suivants.
B.a. X._ est né en 1972 au Kenya, pays dont il est ressortissant. Il y a suivi sa scolarité jusqu'à l'âge de 14 ans, puis a entrepris une maturité. Il a ensuite effectué une formation de steward en gastronomie et a travaillé dans un hôtel. En 2004, le prénommé est venu s'installer en Suisse. Il s'est marié en 2004, son épouse étant depuis décédée. En Suisse, il a oeuvré dans la restauration, puis dans une entreprise de déménagement, avant d'obtenir un emploi comme steward aux CFF. X._ est père de deux enfants, nés d'une précédente union, qui vivent en Afrique auprès de leur famille maternelle. Il a toujours des contacts avec eux et leur envoie régulièrement de l'argent. Depuis le 1er octobre 2018, il travaille comme gérant pour un établissement à A._.
Son casier judiciaire suisse ne fait état d'aucune inscription.
B.b. Le 23 avril 2017, X._ a été contacté par un trafiquant de stupéfiants qui lui a demandé de se rendre à B._ et de transporter de la cocaïne, en contrepartie d'un montant de 1'250 fr., soit 900 fr. à remettre au fournisseur de B._ et 350 fr. pour le transport.
Le lendemain, à C._, X._, de retour de B._, a pris en charge le trafiquant précité dans son véhicule et lui a remis 15 "fingers" de cocaïne, soit 170 g bruts dont 118,2 g de cocaïne pure.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement du 19 octobre 2018, en concluant, avec suite de frais et dépens, principalement à sa réforme en ce sens que son expulsion du territoire suisse n'est pas ordonnée et, subsidiairement, à 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 établi les faits de manière arbitraire. On peine à distinguer, dans son argumentation, dans quelle mesure ce grief se distingue de celui consacré à la violation des art. 66a CP et 8 CEDH, l'intéressé mélangeant la discussion des faits avec des considérations juridiques concernant les dispositions précitées. Force est de constater que, dans la mesure où le recourant s'écarte de l'état de fait de la cour cantonale ou introduit des éléments qui n'en ressortent pas, sa démarche demeure purement appellatoire (cf. à cet égard l'arrêt publié aux ATF 142 III 364 consid. 2.4 p. 368 et les références citées) et ne répond pas aux réquisits de motivation découlant de l'art. 106 al. 2 LTF.
2.
Le recourant fait grief à l'autorité précédente d'avoir ordonné son expulsion du territoire suisse.
2.1. Aux termes de l'art. 66a al. 1 let. o CP, le juge expulse de Suisse l'étranger qui est condamné notamment pour infraction à l'art. 19 al. 2 LStup, quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de cinq à quinze ans. Selon l'art. 66a al. 2 CP, le juge peut exceptionnellement renoncer à une expulsion lorsque celle-ci mettrait l'étranger dans une situation personnelle grave et que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. A cet égard, il tiendra compte de la situation particulière de l'étranger qui est né ou qui a grandi en Suisse.
En l'espèce, le recourant a commis une infraction (infraction à l'art. 19 al. 2 LStup) qui tombe sous le coup de l'art. 66a al. 1 let. o CP. Il remplit donc a priori les conditions d'une expulsion, sous la réserve d'une application de l'art. 66a al. 2 CP, voire également des normes de droit international.
2.2. Les conditions pour appliquer l'art. 66a al. 2 CP sont cumulatives. Afin de pouvoir renoncer à une expulsion prévue par l'art. 66a al. 1 CP, il faut, d'une part, que cette mesure mette l'étranger dans une situation personnelle grave et, d'autre part, que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse (arrêts 6B_1262/2018 du 29 janvier 2019 consid. 2.2; 6B_1117/2018 du 11 janvier 2019 consid. 2.2; 6B_209/2018 du 23 novembre 2018 consid. 3.3 destiné à la publication). Le juge doit faire usage du pouvoir d'appréciation qui lui est conféré par une norme potestative dans le respect des principes constitutionnels. S'il devait refuser de renoncer à l'expulsion alors que les conditions de la clause de rigueur sont remplies, le principe de proportionnalité ancré à l'art. 5 al. 2 Cst. serait violé. Le juge doit ainsi renoncer à l'expulsion lorsque les conditions de l'art. 66a al. 2 CP sont réunies, conformément au principe de proportionnalité (arrêts 6B_1262/2018 précité consid. 2.2; 6B_1117/2018 précité consid. 2.2; 6B_209/2018 précité consid. 3.3 destiné à la publication).
2.3.
2.3.1. La loi ne définit pas ce qu'il faut entendre par une "situation personnelle grave" (première condition cumulative) ni n'indique les critères à prendre en compte dans la pesée des intérêts (seconde condition cumulative).
En recourant à la notion de cas de rigueur dans le cadre de l'art. 66a al. 2 CP, le législateur a fait usage d'un concept ancré depuis longtemps dans le droit des étrangers. Compte tenu également du lien étroit entre l'expulsion pénale et les mesures du droit des étrangers, il est justifié de s'inspirer, de manière générale, des critères prévus par l'art. 31 al. 1 de l'ordonnance relative à l'admission, au séjour et à l'exercice d'une activité lucrative (OASA; RS 142.201) et de la jurisprudence y relative, dans le cadre de l'application de l'art. 66a al. 2 CP. L'art. 31 al. 1 OASA prévoit qu'une autorisation de séjour peut être octroyée dans les cas individuels d'extrême gravité. Elle commande de tenir compte notamment de l'intégration du requérant, du respect de l'ordre juridique suisse par le requérant, de la situation familiale, particulièrement de la période de scolarisation et de la durée de la scolarité des enfants, de la situation financière ainsi que de la volonté de prendre part à la vie économique et d'acquérir une formation, de la durée de la présence en Suisse, de l'état de santé ainsi que des possibilités de réintégration dans l'Etat de provenance. Comme la liste de l'art. 31 al. 1 OASA n'est pas exhaustive et que l'expulsion relève du droit pénal, le juge devra également, dans l'examen du cas de rigueur, tenir compte des perspectives de réinsertion sociale du condamné (cf. 6B_1117/2018 précité consid. 2.3.1; arrêts 6B_209/2018 précité consid. 3.3.2 destiné à la publication; 6B_371/2018 du 21 août 2018 consid. 2.4 et 2.5 et les références citées). En règle générale, il convient d'admettre l'existence d'un cas de rigueur au sens de l'art. 66a al. 2 CP lorsque l'expulsion constituerait, pour l'intéressé, une ingérence d'une certaine importance dans son droit au respect de sa vie privée et familiale garanti par la Constitution fédérale (art. 13 Cst.) et par le droit international, en particulier l'art. 8 CEDH (arrêts 6B_1262/2018 précité consid. 2.3.1; 6B_1117/2018 précité consid. 2.3.1; 6B_1079/2018 du 14 décembre 2018 consid. 1.3; 6B_965/2018 du 15 novembre 2018 consid. 4.3).
2.3.2. Selon la jurisprudence, pour se prévaloir du respect au droit de sa vie privée, l'étranger doit établir l'existence de liens sociaux et professionnels spécialement intenses avec la Suisse, notablement supérieurs à ceux qui résultent d'une intégration ordinaire. Le Tribunal fédéral n'adopte pas une approche schématique qui consisterait à présumer, à partir d'une certaine durée de séjour en Suisse, que l'étranger y est enraciné et dispose de ce fait d'un droit de présence dans notre pays. Il procède bien plutôt à une pesée des intérêts en présence, en considérant la durée du séjour en Suisse comme un élément parmi d'autres et en n'accordant qu'un faible poids aux années passées en Suisse dans l'illégalité, en prison ou au bénéfice d'une simple tolérance (cf. ATF 134 II 10 consid. 4.3 p. 24; plus récemment arrêts 6B_965/2018 du 15 novembre 2018 consid. 4.3; 6B_296/2018 du 13 juillet 2018 consid. 3.1).
En l'espèce, il est douteux que le recourant puisse se prévaloir d'un droit au respect de sa vie privée, au sens de l'art. 8 par. 1 CEDH, dès lors qu'il ne présente pas des liens sociaux ou professionnels spécialement intenses avec la Suisse et que son intégration dans ce pays n'est pas particulièrement forte. Le seul élément d'intégration mis en avant par l'intéressé est celui du travail qu'il exerce en Suisse, ce qui relève tout au plus d'une intégration "ordinaire" au sens de la jurisprudence précitée.
Par ailleurs, les relations visées par l'art. 8 CEDH sont avant tout celles qui concernent la famille dite nucléaire, soit celles qui existent entre époux ainsi qu'entre parents et enfants mineurs vivant en ménage commun (ATF 144 II 1 consid. 6.1 p. 12; 135 I 143 consid. 1.3.2 p. 146). Sous réserve de circonstances particulières, les concubins ne sont donc pas habilités à invoquer l'art. 8 CEDH. D'une manière générale, il faut que les relations entre les concubins puissent, par leur nature et leur stabilité, être assimilées à une véritable union conjugale pour bénéficier de la protection de l'art. 8 par. 1 CEDH (cf. arrêt 6B_612/2018 du 22 août 2018 consid. 2.2 et les références citées). En l'occurrence, le recourant ne saurait se prévaloir des droits découlant de l'art. 8 par. 1 CEDH en raison de la relation intime qu'il entretient avec "sa nouvelle amie" en Suisse, puisqu'il ne prétend pas que ce lien pourrait être assimilé à une union conjugale. L'intéressée a d'ailleurs uniquement déclaré, durant les débats de première instance, que le recourant et elle étaient "très bons amis" (cf. jugement du 30 mai 2018, p. 6).
Enfin, si le recourant affirme entretenir des "liens très forts" avec sa cousine en Suisse, celui-ci ne prétend pas qu'il existerait, à son égard, un rapport de dépendance particulier, par exemple en raison d'une maladie ou d'un handicap (cf. ATF 137 I 154 consid. 3.4.2 p. 159; arrêts 2C_293/2018 du 5 octobre 2018 consid. 1.4; 2C_108/2018 du 28 septembre 2018 consid. 5.3 et les références citées), de sorte qu'il ne saurait en déduire une protection fondée sur l'art. 8 par. 1 CEDH.
Quoi qu'il en soit, à supposer que le recourant puisse se prévaloir d'un droit découlant de l'art. 8 par. 1 CEDH - en l'occurrence d'un droit au respect de sa vie privée -, son expulsion pourrait de toute manière être confirmée au regard de l'art. 8 par. 2 CEDH (cf. consid. 2.4.2 infra).
2.4. Il convient de déterminer si l'intérêt privé du recourant à demeurer en Suisse pourrait l'emporter sur les intérêts publics présidant à son expulsion. Cet examen implique en particulier de déterminer si la mesure litigieuse respecte le principe de la proportionnalité découlant des art. 5 al. 2 Cst. et 8 par. 2 CEDH (cf. arrêts 6B_1262/2018 précité consid. 2.4; 6B_1079/2018 précité consid. 1.4; 6B_1027/2018 du 7 novembre 2018 consid. 1.5).
2.4.1. La cour cantonale a exposé que le recourant était intégré professionnellement et socialement en Suisse. Il parlait couramment le suisse-allemand et avait retrouvé un emploi à temps partiel. L'intéressé n'était pas né en Suisse ni n'y avait grandi. Il était arrivé dans ce pays à l'âge de 32 ans et n'y avait plus de famille hormis une cousine. Au contraire, il avait effectué sa scolarité dans son pays d'origine et y avait obtenu une maturité. Il y avait ensuite suivi une formation puis y avait travaillé durant cinq années. En outre, le recourant avait de la famille au Kenya. Il avait deux enfants âgés de 12 et 16 ans, avec lesquels il conservait des contacts par téléphone et par l'application Skype. En définitive, l'intéressé avait vécu durant 32 ans dans son pays d'origine et avait eu l'occasion d'y développer des liens socio-professionnels importants. Il lui était donc possible de retourner au Kenya pour y vivre.
2.4.2. En l'espèce, les intérêts présidant à l'expulsion du recourant sont importants, dès lors que celui-ci s'est livré à un trafic de stupéfiants ayant porté sur une quantité de 118,2 g de cocaïne pure. A cet égard, on rappellera que la Cour européenne des droits de l'Homme estime que, compte tenu des ravages de la drogue dans la population, les autorités sont fondées à faire preuve d'une grande fermeté à l'encontre de ceux qui contribuent à la propagation de ce fléau (cf. arrêts CourEDH K.M. c. Suisse du 2 juin 2015 [requête no 6009/10] § 55; Dalia c. France du 19 février 1998, Recueil CourEDH 1998-I 76 § 54; cf. aussi arrêt 6B_1192/2018 du 23 janvier 2019 consid. 2.2.3). Par ailleurs, il convient de relever que la peine privative de liberté à laquelle a été condamné le recourant dépasse une année, ce qui pourrait permettre une révocation de son autorisation de séjour sur la base de l'art. 62 al. 1 let. b LEI (cf. ATF 139 I 145 consid. 2.1 p. 147, selon lequel constitue une "peine privative de liberté de longue durée" au sens de l'art. 62 al. 1 let. b LEtr [depuis le 1er janvier 2019 : LEI] toute peine dépassant un an d'emprisonnement).
Le recourant est arrivé en Suisse à l'âge adulte et n'y a passé qu'une quinzaine d'années. Son intégration en Suisse est uniquement professionnelle, l'intéressé ne revendiquant aucune participation particulière à la vie sociale. Rien ne permet de considérer que le recourant se réintégrerait plus difficilement au Kenya - où il possède de la famille et où il a déjà travaillé par le passé - qu'en Suisse. Le temps écoulé depuis la commission des infractions n'est pas important. Il ne ressort par ailleurs pas du jugement attaqué que le comportement du recourant durant cette période aurait été particulièrement bon ou mauvais.
Le recourant met en avant les différents travaux qu'il a exercés en Suisse ainsi que l'emploi dont il bénéficie actuellement et la satisfaction donnée à son employeur. On ne voit pas que cet élément aurait été ignoré par la cour cantonale, ni qu'il constituerait l'unique aspect déterminant dans la pesée des intérêts à effectuer en matière d'expulsion.
En définitive, compte tenu de la gravité de l'infraction sanctionnée en matière de stupéfiants et de l'intégration tout au plus ordinaire du recourant en Suisse, l'intérêt public à l'expulsion l'emporte sur l'intérêt privé de l'intéressé à demeurer dans ce pays. La réintégration au Kenya, pays dans lequel celui-ci a grandi, a passé la majeure partie de sa vie et avec lequel il conserve des liens culturels et familiaux, ne sera pas particulièrement difficile. Il n'apparaît pas que le recourant s'y trouvera dans une situation sensiblement plus défavorable. Dans ces circonstances, l'expulsion s'avère conforme au principe de la proportionnalité.
2.5. La seconde condition pour l'application de l'art. 66a al. 2 CP n'étant pas réalisée, la cour cantonale n'a pas violé le droit fédéral, constitutionnel ou international en ordonnant l'expulsion du recourant pour une durée de sept ans.
3.
Le recours doit être rejeté dans la mesure où il est recevable. 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é dans la mesure où il est recevable.
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 14 février 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa