Just to expand on Divesh's response:
"Q2 - I think same layer instance cannot exist in two maps. Either remove it from the first map before adding it to the new one, or make a copy of it."
On line 16 you declared
var map = mobileMapPackage.maps[0]
But then on line 18 that map was not assigned to MapView.map
self.mapView.map = AGSMap(basemap:AGSBasemap.lightGrayCanvasBasemap())
Depending on when/whether mobileMapPackage.maps[0] ever loads its layers, you may have a race condition on your hands between your line 18 AGSMap and the AGSMap at mobileMapPackage.maps[0] for which one gets to claim the layers in the operationalLayers property.
You can avoid this by using the AGSMap at mobileMapPackage.maps[0] instead of the created one from line 18, meaning make line 18 into
self.mapView.map = mobileMapPackage.maps[0]
You could then add the grey basemap in manually as an AGSArcGISTiledLayer, inserting it either at index 0 of the .operationalLayers array, or in the basemap.basemapLayers array of the AGSMap.
I ran into similar problems in my app when I first switched from the Runtime SDK 10.2.x .geodatabase files over to the 100.x SDK's MMPKs, and found that a layer coming from an MMPK can only be assigned/used in one AGSMap at a time. If it's already assigned to an AGSMap's operationalLayers (or manually assigned to basemap.basemapLayers), it couldn't be used in another AGSMap. But wait, you think to yourself, I'm only assigning the layers to the map I created once - like on line 22 of the code above. The trick is with MMPKs that they already come with an AGSMap, the one you grab them from at mobileMapPackage.maps[0]. That means your layers are already being claimed.
And yet, your map successfully loaded those layers anyway. What gives? The layers after line 22 existed in the .operationalLayers array of both your mapView.map.operationalLayers and in mobileMapPackage.maps[0].operationalLayers. The answer I believe is in the async nature of the 100.x SDK. Just to muddy things up further the 100.x SDK is asynchronous for faster startup times. Objects like the AGSMap and the AGSLayers are only partially initialized at first (you can check this in debug during startup on the .loaded property of these objects). Loading GIS data can be slooow, and to keep that from killing your startup time for big datasets the new SDK gives you more power to create objects before you load them with data. One of the tripwires to tell the SDK it's time to load the data is to assign a map to the MapView.map object, which you do on line 18. That means your created map is starting to lay claim to its AGSLayers first (probably loading your grey basemap layer first), and then getting first crack at the AGSLayers you assign to it on line 22. The early bird gets the worm, and I think your created AGSMap gets the operationalLayers even if they're already assigned to mobileMapPackage.maps[0]. The part I can't advise you on is when the mobileMapPackage.maps[0] AGSMap starts to contend for those layers. I can only say that in my app the MMPK object won the race instead and I couldn't load my layers in the mapView.map until I removed them from the MMPK's operationalLayers array.
One more thought that crosses my mind is whether the spatial reference of your operational layers can play nice with web mercator of the light grey basemap. That's probably not it, but bears mention as part of our mental checklist as GIS developers.
I realize this is an old post I'm responding to, but I hope this helps in case others run across this problem.
-Reed