Swift版国内省市县三级联动

1、引入数据模型 CountryCityModel.swift

如下文件为省市县最新数据Model,使用的struct 结构体处理,比类的内存占用更小:

import Foundation

/**
 * 国家、省份、城市数据模型
 */
struct CountryCityModel {
    
    //MARK: - proterty
    /** 当前国家 */
    static var current_country = "中国"
    /** 当前省份 */
    static var current_province = "请选择"
    /** 当前市 */
    static var current_city = "请选择"
    /** 当前县 */
    static var current_county = "请选择"
    
    ///
    //定义数组,存储省份信息
    ///
    private static let china = ["直辖市", "特别行政区", "浙江", "江苏", "广东", "福建", "湖南", "湖北", "辽宁",
    "吉林", "黑龙江", "河北", "河南", "山东", "陕西", "甘肃", "新疆", "青海", "山西", "四川",
    "贵州", "安徽", "江西", "云南", "内蒙古", "西藏", "广西", "宁夏", "海南", "台湾"]
    
    
    ///
    //定义数组,存储市级信息
    ///
    private static let zhixiashi = ["北京", "上海", "天津", "重庆"]
    private static let jiangsu = ["南京", "无锡", "常州", "徐州", "苏州", "南通", "连云港", "淮安", "扬州", "盐城", "镇江", "泰州", "宿迁"]
    private static let zhejiang = ["杭州", "宁波", "温州", "嘉兴", "湖州", "绍兴", "金华", "衢州", "舟山", "台州", "利水"]
    private static let guangdong = ["广州", "韶关", "深圳", "珠海", "汕头", "佛山", "江门", "湛江", "茂名", "肇庆", "惠州", "梅州", "汕尾", "河源", "阳江", "清远", "东莞", "中山", "潮州", "揭阳"]
    private static let fujiang = ["福州", "厦门", "莆田", "三明", "泉州", "漳州", "南平", "龙岩", "宁德"]
    private static let hunan = ["长沙", "株洲", "湘潭", "衡阳", "邵阳", "岳阳", "常德", "张家界", "益阳", "郴州", "永州", "怀化", "娄底", "湘西土家苗族自治区"]
    private static let hubei = ["武汉", "襄阳", "黄石", "十堰", "宜昌", "鄂州", "荆门", "孝感", "荆州", "黄冈", "咸宁", "随州", "恩施土家族苗族自治州"]
    private static let liaoning = ["沈阳", "大连", "鞍山", "抚顺", "本溪", "丹东", "锦州", "营口", "阜新", "辽阳", "盘锦", "铁岭", "朝阳", "葫芦岛"]
    private static let jilin = ["长春", "吉林", "四平", "辽源", "通化", "白山", "松原", "白城", "延边朝鲜族自治区"]
    private static let heilongjiang = ["哈尔滨", "齐齐哈尔", "鸡西", "牡丹江", "佳木斯", "大庆", "伊春", "黑河", "大兴安岭","鹤岗","双鸭山","七台河","绥化"]
    private static let hebei = ["石家庄", "保定", "唐山", "邯郸", "承德", "廊坊", "衡水", "秦皇岛", "张家口","邢台","沧州"]
    private static let henan = ["郑州", "洛阳", "商丘", "安阳", "南阳", "开封", "平顶山", "焦作", "新乡", "鹤壁", "许昌", "漯河", "三门峡", "信阳", "周口", "驻马店","济源" ,"濮阳"]
    private static let shandong = ["济南", "青岛", "菏泽", "淄博", "枣庄", "东营", "烟台", "潍坊", "济宁", "泰安", "威海", "日照", "滨州", "德州", "聊城", "临沂","莱芜"]
    private static let shangxi = ["西安", "宝鸡", "咸阳", "渭南", "铜川", "延安", "榆林", "汉中", "安康", "商洛"]
    private static let gansu = ["兰州", "嘉峪关", "金昌", "金川", "白银", "天水", "武威", "张掖", "酒泉", "平凉", "庆阳", "定西", "陇南", "临夏", "合作"]
    private static let qinghai = ["西宁", "海东地区", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州", "果洛藏族自治州", "玉树藏族自治州", "海西蒙古族藏族自治州"]
    private static let xinjiang = ["乌鲁木齐", "奎屯", "石河子", "昌吉", "吐鲁番", "库尔勒", "阿克苏", "喀什", "伊宁", "克拉玛依", "塔城", "哈密", "和田", "阿勒泰", "阿图什", "博乐"]
    private static let shanxi = ["太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中", "运城", "忻州", "临汾", "吕梁"]
    private static let sichuan = ["成都", "自贡", "攀枝花", "泸州", "德阳", "绵阳", "广元", "遂宁", "内江", "乐山", "南充", "眉山", "宜宾", "广安", "达州", "雅安", "巴中", "资阳", "阿坝藏族羌族自治州", "甘孜藏族自治州", "凉山彝族自治州"]
    private static let guizhou = ["贵阳", "六盘水", "遵义", "安顺", "黔南布依族苗族自治州", "黔西南布依族苗族自治州", "黔东南苗族侗族自治州", "铜仁", "毕节"]
    private static let anhui = ["合肥", "芜湖", "安庆", "马鞍山", "阜阳", "六安", "滁州", "宿州", "蚌埠", "淮南", "宣城", "亳州", "淮北", "铜陵", "黄山", "池州"]
    private static let jiangxi = ["南昌", "九江", "景德镇", "萍乡", "新余", "鹰潭", "赣州", "宜春", "上饶", "吉安", "抚州"]
    private static let yunnan = ["昆明", "曲靖", "玉溪", "保山", "昭通", "丽江", "普洱", "临沧", "楚雄彝族自治州", "大理白族自治州", "红河哈尼族彝族自治州", "文山壮族苗族自治州", "西双版纳傣族自治州", "德宏傣族景颇族自治州", "怒江傈僳族自治州", "迪庆藏族自治州"]
    private static let neimenggu = ["呼和浩特", "包头", "乌海", "赤峰", "通辽", "鄂尔多斯", "呼伦贝尔", "巴彦淖尔", "乌兰察布","兴安盟","锡林郭勒盟","阿拉善盟"]
    private static let guangxi = ["南宁", "柳州", "桂林", "梧州", "北海", "防城港", "钦州", "贵港", "玉林", "百色", "贺州", "河池", "崇左","来宾"]
    private static let xizang = ["拉萨", "昌都地区", "林芝地区", "山南地区", "日喀则地区", "那曲地区", "阿里地区"]
    private static let ningxia = ["银川", "石嘴山", "吴忠", "固原", "中卫"]
    private static let hainan = ["海口", "三亚"]
    private static let taiwan = ["台北", "高雄", "基隆", "台中", "台南", "新竹", "嘉义"]
    private static let tebiexingzhengqu = ["香港", "澳门"]
    
    
    ///
    //定义数组,存储县信息
    ///
    private static let beijing = ["东城区", "西城区", "海淀区", "朝阳区", "丰台区", "石景山区", "通州区", "顺义区", "房山区", "大兴区", "昌平区", "怀柔区", "平谷区", "门头沟区", "延庆县", "密云县"]
    private static let shanghai = ["浦东新区", "徐汇区", "长宁区", "普陀区", "闸北区", "虹口区", "杨浦区", "黄浦区", "卢湾区", "静安区", "宝山区", "闵行区", "嘉定区", "金山区", "松江区", "青浦区", "南汇区", "奉贤区", "崇明县"]
    private static let tianjing = ["河东", "南开", "河西", "河北", "和平", "红桥", "东丽", "津南", "西青", "北辰", "塘沽", "汉沽", "大港", "蓟县", "宝坻", "宁河", "静海", "武清"]
    private static let chongqing = ["渝中区", "大渡口区", "江北区", "沙坪坝区", "九龙坡区", "南岸区", "北碚区", "万盛区", "双桥区", "渝北区", "巴南区", "万州区", "涪陵区", "黔江区", "长寿区", "江津区", "合川区", "永川区", "南川区"]
    private static let aomeng = ["澳门半岛", "氹仔岛", "路环岛"]
    private static let xianggang = ["中西区", "湾仔区", "东区", "南区", "九龙城区", "油尖旺区", "观塘区", "黄大仙区", "深水埗区", "北区", "大埔区", "沙田区", "西贡区", "元朗区", "屯门区", "荃湾区", "葵青区", "离岛区"]
    
    //MARK: - class method
    /** 国家 */
    static var Country:[String] {
        get {
            return ["请选择","中国"];
        }
    }
    
    /**
     * 省份
     * @return [String]
     */
    static var Province:[String] {
        get {
            
            switch current_country {
            case "中国":
                return china;
            default:
                return ["请选择"];
            }
        }
    }
    
    /**
     * 城市
     * @return [String]
     */
    static var City:[String] {
        get{
            switch current_province {
            case "直辖市":return zhixiashi;
            case "浙江":return zhejiang;
            case "江苏":return jiangsu;
            case "广东":return guangdong;
            case "福建":return fujiang;
            case "湖南":return hunan;
            case "湖北":return hubei;
            case "辽宁":return liaoning;
            case "吉林":return jilin;
            case "黑龙江":return heilongjiang;
            case "河北":return hebei;
            case "河南":return henan;
            case "山东":return shandong;
            case "陕西":return shangxi;
            case "甘肃":return gansu;
            case "新疆":return xinjiang;
            case "青海":return qinghai;
            case "山西":return shanxi;
            case "四川":return sichuan;
            case "贵州":return guizhou;
            case "安徽":return anhui;
            case "江西":return jiangxi;
            case "云南":return yunnan;
            case "内蒙古":return neimenggu;
            case "西藏":return xizang;
            case "广西":return guangxi;
            case "宁夏":return ningxia;
            case "海南":return hainan;
            case "特别行政区":return tebiexingzhengqu;
            case "台湾":return taiwan;
            default:
                current_province = "直辖市";
                current_city = "北京";
                return beijing;
            }
        }
    }
    
    /**
     * 县
     * @return [String]
     */
    static var County:[String] {
        
        get{
            switch(current_city){
            case "天津":return tianjing;
            case "上海":return shanghai;
            case "重庆":return chongqing;
            case "澳门":return aomeng;
            case "香港":return xianggang;
            /** 江苏 */
            case "南京":return ["玄武区","白下区","秦淮区","建邺区","鼓楼区","下关区","浦口区","栖霞区","雨花台区","江宁区","六合区","溧水县","高淳县"];
            case "无锡":return ["崇安区","南长区","北塘区","锡山区","惠山区","滨湖区","江阴市","宜兴市"];
            case "徐州":return ["鼓楼区","云龙区","贾汪区","泉山区","铜山区","丰县","沛县","睢宁县","新沂市","邳州市"];
            case "常州":return ["天宁区","钟楼区","戚墅堰区","新北区","武进区","溧阳市","金坛市"];
            case "苏州":return ["沧浪区","平江区","金阊区","虎丘区","吴中区","相城区","常熟市" ,"张家港市" ,"昆山市","吴江市","太仓市"];
            case "南通":return ["崇川区","港闸区","通州区","海安县","如东县","启东市","如皋市","海门市"];
            case "连云港":return ["连云区","新浦区","海州区","赣榆县","东海县","灌云县","灌南县"];
            case "淮安":return ["清河区","楚州区","淮阴区","清浦区","涟水县","洪泽县","盱眙县","金湖县"];
            case "盐城":return ["亭湖区","盐都区","响水县","滨海县","阜宁县","射阳县","建湖县","东台市","大丰市"];
            case "扬州":return ["广陵区","邗江区","江都区","宝应县","仪征市","高邮市"];
            case "镇江":return ["京口区","润州区","丹徒区","丹阳市","扬中市","句容市"];
            case "泰州":return ["海陵区","高港区","兴化市","靖江市","泰兴市","姜堰市"];
            case "宿迁":return ["宿城区","宿豫区","沭阳县","泗阳县","泗洪县"];
            /** 浙江 */
            case "杭州":return ["上城区","下城区","江干区","拱墅区","西湖区","滨江区","萧山区","余杭区","桐庐县","淳安县","建德市","富阳市","临安市"]
            case "宁波":return ["海曙区","江东区","江北区","北仑区","镇海区","鄞州区","象山县","宁海县","余姚市","慈溪市","奉化市"]
            case "温州":return ["鹿城区","龙湾区","瓯海区","洞头县","永嘉县","平阳县","苍南县","文成县","泰顺县","瑞安市","乐清市"]
            case "嘉兴":return ["南湖区","秀洲区","嘉善县","海盐县","海宁市","平湖市","桐乡市"]
            case "湖州":return ["吴兴区","南浔区","德清县","长兴县","安吉县"]
            case "绍兴":return ["越城区","绍兴县","新昌县","诸暨市","上虞市","嵊州市"]
            case "金华":return ["婺城区","金东区","武义县","浦江县","磐安县","兰溪市","义乌市","东阳市","永康市"]
            case "衢州":return ["柯城区","衢江区","常山县","开化县","龙游县","江山市"]
            case "舟山":return ["定海区","普陀区","岱山县","嵊泗县"]
            case "台州":return ["椒江区","黄岩区","路桥区","玉环县","三门县","天台县","仙居县","温岭市","临海市"]
            case "利水":return ["莲都区","青田县","缙云县","遂昌县","松阳县","云和县","庆元县","景宁畲族自治县","龙泉市" ]
            /** 广东 */
            case "广州":return ["荔湾区","越秀区","海珠区","天河区","白云区","黄埔区","番禺区","花都区","南沙区","萝岗区","增城市","从化市"]
            case "韶关":return ["武江区","浈江区","曲江区","始兴县","仁化县","翁源县","乳源瑶族自治县","新丰县","乐昌市","南雄市"]
            case "深圳":return ["罗湖区","福田区","南山区","宝安区","龙岗区","盐田区"]
            case "珠海":return ["香洲区","斗门区","金湾区"]
            case "汕头":return ["龙湖区","金平区","濠江区","潮阳区","潮南区","澄海区","南澳县"]
            case "佛山":return ["禅城区","南海区","顺德区","三水区","高明区"]
            case "江门":return ["蓬江区","江海区","新会区","台山市","开平市","鹤山市","恩平市"]
            case "湛江":return ["赤坎区","霞山区","坡头区","麻章区","遂溪县","徐闻县","廉江市","雷州市","吴川市"]
            case "茂名":return ["茂南区","茂港区","电白县","高州市","化州市","信宜市"]
            case "肇庆":return ["端州区","鼎湖区","广宁县","怀集县","封开县","德庆县","高要市","四会市"]
            case "惠州":return ["惠城区","惠阳区","博罗县","惠东县","龙门县"]
            case "梅州":return ["梅江区","梅县","大埔县","丰顺县","五华县","平远县","蕉岭县","兴宁市"]
            case "汕尾":return ["城区","海丰县","陆河县","陆丰市"]
            case "河源":return ["源城区","紫金县","龙川县","连平县","和平县","东源县"]
            case "阳江":return ["江城区","阳西县","阳东县","阳春市"]
            case "清远":return ["清城区","佛冈县","阳山县","连山壮族瑶族自治县","连南瑶族自治县","清新县","英德市","连州市"]
            case "东莞":return [""]
            case "中山":return [""]
            case "潮州":return ["湘桥区","潮安县","饶平县"]
            case "揭阳":return ["榕城区","揭东县","揭西县","惠来县"]
            /** 福建 */
            case "福州":return ["鼓楼区","台江区","仓山区","马尾区","晋安区","闽侯县","连江县","罗源县","闽清县","永泰县","平潭县","福清市","长乐市"]
            case "厦门":return ["思明区","海沧区","湖里区","集美区","同安区","翔安区"]
            case "莆田":return ["城厢区","涵江区","荔城区","秀屿区","仙游县"]
            case "三明":return ["梅列区","三元区","明溪县","清流县","宁化县","大田县","尤溪县","沙县","将乐县","泰宁县","建宁县","永安市"]
            case "泉州":return ["鲤城区","丰泽区","洛江区","泉港区","惠安县","安溪县","永春县","德化县","金门县","石狮市","晋江市","南安市"]
            case "漳州":return ["芗城区","龙文区","云霄县","漳浦县","诏安县","长泰县","东山县","南靖县","平和县","华安县","龙海市"]
            case "南平":return ["延平区","顺昌县","浦城县","光泽县","松溪县","政和县","邵武市","武夷山市","建瓯市","建阳市"]
            case "龙岩":return ["新罗区","长汀县","永定县","上杭县","武平县","连城县","漳平市"]
            case "宁德":return ["蕉城区","霞浦县","古田县","屏南县","寿宁县","周宁县","柘荣县","福安市","福鼎市"]
            /** 湖南 */
            case "长沙":return ["芙蓉区","天心区","岳麓区","开福区","雨花区","望城区","长沙县","宁乡县","浏阳市"]
            case "株洲":return ["荷塘区","芦淞区","石峰区","天元区","株洲县","攸县","茶陵县","炎陵县","醴陵市"]
            case "湘潭":return ["雨湖区","岳塘区","湘潭县","湘乡市","韶山市"]
            case "衡阳":return ["珠晖区","雁峰区","石鼓区","蒸湘区","南岳区","衡阳县","衡南县","衡山县","衡东县","祁东县","耒阳市","常宁市"]
            case "邵阳":return ["双清区","大祥区","北塔区","邵东县","新邵县","邵阳县","隆回县","洞口县","绥宁县","新宁县","城步苗族自治县","武冈市"]
            case "岳阳":return ["岳阳楼区","云溪区","君山区","岳阳县","华容县","湘阴县","平江县","汨罗市","临湘市"]
            case "常德":return ["武陵区","鼎城区","安乡县","汉寿县","澧县","临澧县","桃源县","石门县","津市市"]
            case "张家界":return ["永定区","武陵源区","慈利县","桑植县"]
            case "益阳":return ["资阳区","赫山区","南县","桃江县","安化县","沅江市"]
            case "郴州":return ["北湖区","苏仙区","桂阳县","宜章县","永兴县","嘉禾县","临武县","汝城县","桂东县","安仁县","资兴市"]
            case "永州":return ["零陵区","冷水滩区","祁阳县","东安县","双牌县","道县","江永县","宁远县","蓝山县","新田县","江华瑶族自治县"]
            case "怀化":return ["鹤城区","中方县","沅陵县","辰溪县","溆浦县","会同县","麻阳苗族自治县","新晃侗族自治县","芷江侗族自治县","靖州苗族侗族自治县","通道侗族自治县","洪江市"]
            case "娄底":return ["娄星区","双峰县","新化县","冷水江市","涟源市"]
            case "湘西土家苗族自治区":return ["吉首市","泸溪县","凤凰县","花垣县","保靖县","古丈县","永顺县","龙山县"]
            /** 湖北 */
            case "武汉":return ["江岸区","江汉区","汉口区","汉阳区","武昌区","青山区","洪山区","东西湖区","汉南区","蔡甸区","江夏区","黄陂区","新洲区"]
            case "襄阳":return ["襄城区","樊城区","襄州区","南漳县","谷城县","保康县","老河口市","枣阳市","宜城市"]
            case "黄石":return ["黄石港区","西塞山区","下陆区","铁山区","阳新县","大冶市"]
            case "十堰":return ["茅箭区","张湾区","郧县","郧西县","竹山县","竹溪县","房县","丹江口市"]
            case "宜昌":return ["西陵区","伍家岗区","点军区","猇亭区","夷陵区","远安县","兴山县","秭归县","长阳土家族自治县","五峰土家族自治县","宜都市","当阳市","枝江市"]
            case "鄂州":return ["梁子湖区","华容区","鄂城区"]
            case "荆门":return ["东宝区","掇刀区","京山县","沙洋县","钟祥市"]
            case "孝感":return ["孝南区","孝昌县","大悟县","云梦县","应城市","安陆市","汉川市"]
            case "荆州":return ["沙市区","荆州区","公安县","监利县","江陵县","石首市","洪湖市","松滋市"]
            case "黄冈":return ["黄州区","团风县","红安县","罗田县","英山县","浠水县","蕲春县","黄梅县","麻城市","武穴市"]
            case "咸宁":return ["咸安区","温泉开发区","嘉鱼县","通城县","崇阳县","通山县","赤壁市"]
            case "随州":return ["曾都区","随县","广水市"]
            case "恩施土家族苗族自治州":return ["恩施市","利川市","建始县","巴东县","宣恩县","咸丰县","来凤县","鹤峰县"]
            /** 辽宁 */
            case "沈阳":return ["和平区","沈河区","大东区","皇姑区","铁西区","苏家屯区","东陵区","沈北新区","于洪区","辽中县","康平县","法库县","新民市"]
            case "大连":return ["中山区","西岗区","沙河口区","甘井子区","旅顺口区","金州区","长海县","瓦房店市","普兰店市","庄河市"]
            case "鞍山":return ["铁东区","铁西区","立山区","千山区","台安县","岫岩满族自治县","海城市"]
            case "抚顺":return ["新抚区","东洲区","望花区","顺城区","抚顺县","新宾满族自治县","清原满族自治县"]
            case "本溪":return ["平山区","溪湖区","明山区","南芬区","本溪满族自治县","桓仁满族自治县"]
            case "丹东":return ["元宝区","振兴区","振安区","宽甸满族自治县","东港市","凤城市"]
            case "锦州":return ["古塔区","凌河区","太和区","黑山县","义县","凌海市","北镇市"]
            case "营口":return ["站前区","西市区","鲅鱼圈区","老边区","盖州市","大石桥市"]
            case "阜新":return ["海州区","新邱区","太平区","清河门区","细河区","阜新蒙古族自治县","彰武县"]
            case "辽阳":return ["白塔区","文圣区","宏伟区","弓长岭区","太子河区","辽阳县","灯塔市"]
            case "盘锦":return ["双台子区","兴隆台区","大洼县","盘山县"]
            case "铁岭":return ["银州区","清河区","铁岭县","西丰县","昌图县","调兵山市","开原市"]
            case "朝阳":return ["双塔区","龙城区","朝阳县","建平县","喀喇沁左翼蒙古族自治县","北票市","凌源市"]
            case "葫芦岛":return ["连山区","龙港区","南票区","绥中县","建昌县","兴城市"]
            /** 吉林 */
            case "长春":return ["南关区","宽城区","朝阳区","二道区","绿园区","双阳区","农安县","九台市","榆树市","德惠市"]
            case "吉林":return ["昌邑区","龙潭区","船营区","丰满区","永吉县","蛟河市","桦甸市","舒兰市","磐石市"]
            case "四平":return ["铁西区","铁东区","梨树县","伊通满族自治县","公主岭市","双辽市"]
            case "辽源":return ["龙山区","西安区","东丰县","东辽县"]
            case "通化":return ["东昌区","二道江区","通化县","辉南县","柳河县","梅河口市","集安市"]
            case "白山":return ["八道江区","江源区","抚松县","靖宇县","长白朝鲜族自治县","临江市"]
            case "松原":return ["临江市","宁江区","前郭尔罗斯蒙古族自治县","长岭县","乾安县","扶余县"]
            case "白城":return ["洮北区","镇赉县","通榆县","洮南市","大安市"]
            case "延边朝鲜族自治区":return ["延吉市","图们市","敦化市","珲春市","龙井市","和龙市","汪清县","安图县"]
            /** 黑龙江 */
            case "哈尔滨":return ["道里区","南岗区","道外区","平房区","松北区","香坊区","呼兰区","阿城区","依兰县","方正县","宾县","巴彦县","木兰县","通河县","延寿县","双城市","尚志市","五常市"]
            case "齐齐哈尔":return ["龙沙区","建华区","铁锋区","昂昂溪区","富拉尔基区","碾子山区","梅里斯达斡尔族区","龙江县","依安县","泰来县","甘南县","富裕县","克山县","克东县","拜泉县","讷河市"]
            case "鸡西":return ["鸡冠区","恒山区","滴道区","梨树区","城子河区","麻山区","鸡东县","虎林市","密山市"]
            case "鹤岗":return ["向阳区","工农区","南山区","兴安区","东山区","兴山区","萝北县","绥滨县"]
            case "双鸭山":return ["尖山区","岭东区","四方台区","宝山区","集贤县","友谊县","宝清县","饶河县"]
            case "佳木斯":return ["向阳区","前进区","东风区","郊区","桦南县","桦川县","汤原县","抚远县","同江市","富锦市"]
            case "大庆":return ["萨尔图区","龙凤区","让胡路区","红岗区","大同区","肇州县","肇源县","林甸县","杜尔伯特蒙古族自治县"]
            case "伊春":return ["伊春区","南岔区","友好区","西林区","翠峦区","新青区","美溪区","金山屯区","五营区","乌马河区","汤旺河区","带岭区","乌伊岭区","红星区","上甘岭区","嘉荫县","铁力市"]
            case "七台河":return ["新兴区","桃山区","茄子河区","勃利县"]
            case "牡丹江":return ["东安区","阳明区","爱民区","西安区","东宁县","林口县","绥芬河市","海林市","宁安市","穆棱市"]
            case "黑河":return ["爱辉区","嫩江县","逊克县","孙吴县","北安市","五大连池市"]
            case "绥化":return ["北林区","望奎县","兰西县","青冈县","庆安县","明水县","绥棱县","安达市","肇东市","海伦市"]
            case "大兴安岭":return ["呼玛县","塔河县","漠河县"]
            /** 河北 */
            case "石家庄":return ["长安区","桥东区","桥西区","新华区","井陉矿区","裕华区","井陉县","正定县","栾城县","行唐县","灵寿县","高邑县","深泽县","赞皇县","无极县","平山县","元氏县","赵县","辛集市","藁城市","晋州市","新乐市","鹿泉市"]
            case "唐山":return ["路南区","路北区","古冶区","开平区","丰南区","丰润区","滦县","滦南县","乐亭县","迁西县","玉田县","唐海县","遵化市","迁安市"]
            case "邯郸":return ["邯山区","丛台区","复兴区","峰峰矿区","邯郸县","临漳县","成安县","大名县","涉县","磁县","肥乡县","永年县","邱县","鸡泽县","广平县","馆陶县","魏县","曲周县","武安市"]
            case "承德":return ["双桥区","双滦区","鹰手营子矿区","承德县","兴隆县","平泉县","滦平县","隆化县","丰宁满族自治县","宽城满族自治县","围场满族蒙古族自治县"]
            case "廊坊":return ["安次区","广阳区","固安县","永清县","香河县","大城县","文安县","大厂回族自治县","霸州市","三河市"]
            case "衡水":return ["桃城区","枣强县","武邑县","武强县","饶阳县","安平县","故城县","景县","阜城县","冀州市","深州市"]
            case "秦皇岛":return ["海港区","山海关区","北戴河区","青龙满族自治县","昌黎县","抚宁县","卢龙县"]
            case "邢台":return ["桥东区","桥西区","邢台县","临城县","内丘县","柏乡县","隆尧县","任县","南和县","宁晋县","巨鹿县","新河县","广宗县","平乡县","威县","清河县","临西县","南宫市","沙河市"]
            case "保定":return ["新市区","北市区","南市区","满城县","清苑县","涞水县","阜平县","徐水县","定兴县","唐县","高阳县","容城县","涞源县","望都县","安新县","易县","曲阳县","蠡县","顺平县","博野县","雄县","涿州市","定州市","安国市","高碑店市"]
            case "张家口":return ["桥东区","桥西区","宣化区","下花园区","宣化县","张北县","康保县","沽源县","尚义县","蔚县","阳原县","怀安县","万全县","怀来县","涿鹿县","赤城县","崇礼县"]
            case "沧州":return ["新华区","运河区","沧县","青县","东光县","海兴县","盐山县","肃宁县","南皮县","吴桥县","献县","孟村回族自治县","泊头市","任丘市","黄骅市","河间市"]
            /** 河南 */
            case "郑州":return ["中原区","二七区","管城回族区","金水区","上街区","惠济区","中牟县","巩义市","荥阳市","新密市","新郑市","登封市"]
            case "洛阳":return ["老城区","西工区","瀍河回族区","涧西区","吉利区","洛龙区","孟津县","新安县","栾川县","嵩县","汝阳县","宜阳县","洛宁县","伊川县","偃师市"]
            case "商丘":return ["梁园区","睢阳区","民权县","睢县","宁陵县","柘城县","虞城县","夏邑县","永城市"]
            case "安阳":return ["文峰区","北关区","殷都区","龙安区","安阳县","汤阴县","滑县","内黄县","林州市"]
            case "南阳":return ["宛城区","卧龙区","南召县","方城县","西峡县","镇平县","内乡县","淅川县","社旗县","唐河县","新野县","桐柏县","邓州市"]
            case "开封":return ["龙亭区","顺河回族区","鼓楼区","禹王台区","金明区","杞县","通许县","尉氏县","开封县","兰考县"]
            case "平顶山":return ["新华区","卫东区","石龙区","湛河区","宝丰县","叶县","鲁山县","郏县","舞钢市","汝州市"]
            case "焦作":return ["解放区","中站区","马村区","山阳区","修武县","博爱县","武陟县","温县","沁阳市","孟州市"]
            case "新乡":return ["红旗区","卫滨区","凤泉区","牧野区","新乡县","获嘉县","原阳县","延津县","封丘县","长垣县","卫辉市","辉县市"]
            case "鹤壁":return ["鹤山区","山城区","淇滨区","浚县","淇县"]
            case "濮阳":return ["华龙区","清丰县","南乐县","范县","台前县","濮阳县"]
            case "许昌":return ["魏都区","许昌县","鄢陵县","襄城县","禹州市","长葛市"]
            case "漯河":return ["源汇区","郾城区","召陵区","舞阳县","临颍县"]
            case "三门峡":return ["湖滨区","渑池县","陕县","卢氏县","义马市","灵宝市"]
            case "信阳":return ["浉河区","平桥区","罗山县","光山县","新县","商城县","固始县","潢川县","淮滨县","息县"]
            case "周口":return ["川汇区","扶沟县","西华县","商水县","沈丘县","郸城县","淮阳县","太康县","鹿邑县","项城市"]
            case "驻马店":return ["驿城区","西平县","上蔡县","平舆县","正阳县","确山县","泌阳县","汝南县","遂平县","新蔡县"]
            case "济源":return ["沁园街道","济水街道","北海街道","天坛街道","玉泉街道","克井镇","五龙口镇","轵城镇","承留镇","邵原镇","坡头镇","梨林镇","大峪镇","思礼镇","王屋镇","下冶镇"]
            /** 山东 */
            case "济南":return ["历下区","市中区","槐荫区","天桥区","历城区","长清区","平阴县","济阳县","商河县","章丘市"]
            case "青岛":return ["市南区","市北区","四方区","黄岛区","崂山区","李沧区","城阳区","胶州市","即墨市","平度市","胶南市","莱西市"]
            case "菏泽":return ["牡丹区","曹县","单县","成武县","巨野县","郓城县","鄄城县","定陶县","东明县"]
            case "淄博":return ["淄川区","张店区","博山区","临淄区","周村区","桓台县","高青县","沂源县"]
            case "枣庄":return ["市中区","薛城区","峄城区","台儿庄区","山亭区","滕州市"]
            case "东营":return ["东营区","河口区","垦利县","利津县","广饶县"]
            case "烟台":return ["芝罘区","福山区","牟平区","莱山区","长岛县","龙口市","莱阳市","莱州市","蓬莱市","招远市","栖霞市","海阳市"]
            case "潍坊":return ["潍城区","寒亭区","坊子区","奎文区","临朐县","昌乐县","青州市","诸城市","寿光市","安丘市","高密市","昌邑市"]
            case "济宁":return ["市中区","任城区","微山县","鱼台县","金乡县","嘉祥县","汶上县","泗水县","梁山县","曲阜市","兖州市","邹城市"]
            case "泰安":return ["泰山区","岱岳区","宁阳县","东平县","新泰市","肥城市"]
            case "威海":return ["环翠区","文登市","荣成市","乳山市"]
            case "日照":return ["东港区","岚山区","五莲县","莒县"]
            case "莱芜":return ["莱城区","钢城区"]
            case "滨州":return ["滨城区","惠民县","阳信县","无棣县","沾化县","博兴县","邹平县"]
            case "德州":return ["德城区","陵县","宁津县","庆云县","临邑县","齐河县","平原县","夏津县","武城县","乐陵市","禹城市"]
            case "聊城":return ["东昌府区","阳谷县","莘县","茌平县","东阿县","冠县","高唐县","临清市"]
            case "临沂":return["兰山区","罗庄区","河东区","沂南县","郯城县","沂水县","苍山县","费县","平邑县","莒南县","蒙阴县","临沭县"]
            /** 陕西 */
            case "西安":return ["新城区","碑林区","莲湖区","灞桥区","未央区","雁塔区","阎良区","临潼区","长安区","蓝田县","周至县","户县","高陵县"]
            case "宝鸡":return ["渭滨区","金台区","陈仓区","凤翔县","岐山县","扶风县","眉县","陇县","千阳县","麟游县","凤县","太白县"]
            case "咸阳":return ["秦都区","杨陵区","渭城区","三原县","泾阳县","乾县","礼泉县","永寿县","彬县","长武县","旬邑县","淳化县","武功县","兴平市"]
            case "渭南":return ["临渭区","华县","潼关县","大荔县","合阳县","澄城县","蒲城县","白水县","富平县","韩城市","华阴市"]
            case "铜川":return ["王益区","印台区","耀州区","宜君县"]
            case "延安":return ["宝塔区","延长县","延川县","子长县","安塞县","志丹县","吴起县","甘泉县","富县","洛川县","宜川县","黄龙县","黄陵县"]
            case "榆林":return ["榆阳区","神木县","府谷县","横山县","靖边县","定边县","绥德县","米脂县","佳县","吴堡县","清涧县","子洲县"]
            case "汉中":return ["汉台区","南郑县","城固县","洋县","西乡县","勉县","宁强县","略阳县","镇巴县","留坝县","佛坪县"]
            case "安康":return ["汉滨区","汉阴县","石泉县","宁陕县","紫阳县","岚皋县","平利县","镇坪县","旬阳县","白河县"]
            case "商洛":return ["商州区","洛南县","丹凤县","商南县","山阳县","镇安县","柞水县"]
            /** 四川 */
            case "成都":return ["锦江区","青羊区","金牛区","武侯区","成华区","龙泉驿区","青白江区","新都区","温江区","金堂县","双流县","郫县","大邑县","蒲江县","新津县","都江堰市","彭州市","邛崃市","崇州市"]
            case "自贡":return ["自流井区","贡井区","大安区","沿滩区","荣县","富顺县"]
            case "攀枝花":return ["东区","西区","仁和区","米易县","盐边县"]
            case "泸州":return ["江阳区","纳溪区","龙马潭区","泸县","合江县","叙永县","古蔺县"]
            case "德阳":return ["旌阳区","中江县","罗江县","广汉市","什邡市","绵竹市"]
            case "绵阳":return ["涪城区","游仙区","三台县","盐亭县","安县","梓潼县","北川羌族自治县","平武县","江油市"]
            case "广元":return ["利州区","元坝区","朝天区","旺苍县","青川县","剑阁县","苍溪县"]
            case "遂宁":return ["船山区","安居区","蓬溪县","射洪县","大英县"]
            case "内江":return ["市中区","东兴区","威远县","资中县","隆昌县"]
            case "乐山":return ["市中区","沙湾区","五通桥区","金口河区","犍为县","井研县","夹江县","沐川县","峨边彝族自治县","马边彝族自治县","峨眉山市"]
            case "南充":return ["顺庆区","高坪区","嘉陵区","南部县","营山县","蓬安县","仪陇县","西充县","阆中市"]
            case "眉山":return ["东坡区","仁寿县","彭山县","洪雅县","丹棱县","青神县"]
            case "宜宾":return ["翠屏区","南溪区","宜宾县","江安县","长宁县","高县","珙县","筠连县","兴文县","屏山县"]
            case "广安":return ["广安区","岳池县","武胜县","邻水县","华蓥市"]
            case "达州":return ["通川区","达县","宣汉县","开江县","大竹县","渠县","万源市"]
            case "雅安":return ["雨城区","名山县","荥经县","汉源县","石棉县","天全县","芦山县","宝兴县"]
            case "巴中":return ["巴州区","通江县","南江县","平昌县"]
            case "资阳":return ["巴州区","通江县","南江县","平昌县"]
            case "阿坝藏族羌族自治州":return ["汶川县","理县","茂县","松潘县","九寨沟县","金川县","小金县","黑水县","马尔康县","壤塘县","阿坝县","若尔盖县","红原县"]
            case "甘孜藏族自治州":return ["康定县","泸定县","丹巴县","九龙县","雅江县","道孚县","炉霍县","甘孜县","新龙县","德格县","白玉县","石渠县","色达县","理塘县","巴塘县","乡城县","稻城县","得荣县"]
            case "凉山彝族自治州":return ["西昌市","木里藏族自治县","盐源县","德昌县","会理县","会东县","宁南县","普格县","布拖县","金阳县","昭觉县","喜德县","冕宁县","越西县","甘洛县","美姑县","雷波县"]
            /** 贵州 */
            case "贵阳":return ["南明区","云岩区","花溪区","乌当区","白云区","小河区","开阳县","息烽县","修文县","清镇市"]
            case "六盘水":return ["钟山区","六枝特区","水城县","盘县"]
            case "遵义":return ["红花岗区","汇川区","遵义县","桐梓县","绥阳县","正安县","道真仡佬族苗族自治县","务川仡佬族苗族自治县","凤冈县","湄潭县","余庆县","习水县","赤水市","仁怀市"]
            case "安顺":return ["西秀区","平坝县","普定县","镇宁布依族苗族自治县","关岭布依族苗族自治县","紫云苗族布依族自治县"]
            case "黔南布依族苗族自治州":return ["都匀市","福泉市","荔波县","贵定县","瓮安县","独山县","平塘县","罗甸县","长顺县","龙里县","惠水县","三都水族自治县"]
            case "黔西南布依族苗族自治州":return ["兴义市","兴仁县","普安县","晴隆县","贞丰县","望谟县","册亨县","安龙县"]
            case "黔东南苗族侗族自治州":return ["凯里市","黄平县","施秉县","三穗县","镇远县","岑巩县","天柱县","锦屏县","剑河县","台江县","黎平县","榕江县","从江县","雷山县","麻江县","丹寨县"]
            case "铜仁":return ["碧江区","万山区","江口县","石阡县","思南县","德江县","玉屏侗族自治县","印江土家族苗族自治县","沿河土家族自治县","松桃苗族自治县"]
            case "毕节":return ["七星关区","大方县","黔西县","金沙县","织金县","纳雍县","威宁彝族回族苗族自治县","赫章县"]
            /** 安徽 */
            case "合肥":return ["瑶海区","庐阳区","蜀山区","包河区","长丰县","肥东县","肥西县","庐江县","巢湖市"]
            case "芜湖":return ["镜湖区","弋江区","鸠江区","三山区","芜湖县","繁昌县","南陵县","无为县"]
            case "安庆":return ["迎江区","大观区","宜秀区","怀宁县","枞阳县","潜山县","太湖县","宿松县","望江县","岳西县","桐城市"]
            case "马鞍山":return ["金家庄区","花山区","雨山区","当涂县","含山县","和县"]
            case "阜阳":return ["颍州区","颍东区","颍泉区","临泉县","太和县","阜南县","颍上县","界首市"]
            case "六安":return ["金安区","裕安区","寿县","霍邱县","舒城县","金寨县","霍山县"]
            case "滁州":return ["琅琊区","南谯区","来安县","全椒县","定远县","凤阳县","天长市","明光市"]
            case "宿州":return ["埇桥区","砀山县","萧县","灵璧县","泗县"]
            case "蚌埠":return ["龙子湖区","蚌山区","禹会区","淮上区","怀远县","五河县","固镇县"]
            case "淮南":return ["大通区","田家庵区","谢家集区","八公山区","潘集区","凤台县"]
            case "宣城":return ["宣州区","郎溪县","广德县","泾县","绩溪县","旌德县","宁国市"]
            case "亳州":return ["谯城区","涡阳县","蒙城县","利辛县"]
            case "淮北":return ["杜集区","相山区","烈山区","濉溪县"]
            case "铜陵":return ["铜官山区","狮子山区","郊区","铜陵县"]
            case "黄山":return ["屯溪区","黄山区","徽州区","歙县","休宁县","黟县","祁门县"]
            case "池州":return ["贵池区","东至县","石台县","青阳县"]
            /** 江西 */
            case "南昌":return ["东湖区","西湖区","青云谱区","湾里区","青山湖区","南昌县","新建县","安义县","进贤县"]
            case "九江":return ["庐山区","浔阳区","九江县","武宁县","修水县","永修县","德安县","星子县","都昌县","湖口县","彭泽县","瑞昌市","共青城市"]
            case "景德镇":return ["昌江区","珠山区","浮梁县","乐平市"]
            case "萍乡":return ["安源区","湘东区","莲花县","上栗县","芦溪县"]
            case "新余":return ["渝水区","分宜县"]
            case "鹰潭":return ["月湖区","余江县","贵溪市"]
            case "赣州":return ["章贡区","赣县","信丰县","大余县","上犹县","崇义县","安远县","龙南县","定南县","全南县","宁都县","于都县","兴国县","会昌县","寻乌县","石城县","瑞金市","南康市"]
            case "宜春":return ["袁州区","奉新县","万载县","上高县","宜丰县","靖安县","铜鼓县","丰城市","樟树市","高安市"]
            case "上饶":return ["信州区","上饶县","广丰县","玉山县","铅山县","横峰县","弋阳县","余干县","鄱阳县","万年县","婺源县","德兴市"]
            case "吉安":return ["吉州区","青原区","吉安县","吉水县","峡江县","新干县","永丰县","泰和县","遂川县","万安县","安福县","永新县","井冈山市"]
            case "抚州":return ["临川区","南城县","黎川县","南丰县","崇仁县","乐安县","宜黄县","金溪县","资溪县","东乡县","广昌县"]
            /** 云南 */
            case "昆明":return ["五华区","盘龙区","官渡区","西山区","东川区","呈贡区","晋宁县","富民县","宜良县","石林彝族自治县","嵩明县","禄劝彝族苗族自治县","寻甸回族彝族自治县","安宁市"]
            case "曲靖":return ["麒麟区","马龙县","陆良县","师宗县","罗平县","富源县","会泽县","沾益县","宣威市"]
            case "玉溪":return ["红塔区","江川县","澄江县","通海县","华宁县","易门县","峨山彝族自治县","新平彝族傣族自治县","元江哈尼族彝族傣族自治县"]
            case "保山":return ["隆阳区","施甸县","腾冲县","龙陵县","昌宁县"]
            case "昭通":return ["昭阳区","鲁甸县","巧家县","盐津县","大关县","永善县","绥江县","镇雄县","彝良县","威信县","水富县"]
            case "丽江":return ["古城区","玉龙纳西族自治县","永胜县","华坪县","宁蒗彝族自治县"]
            case "普洱":return ["思茅区","宁洱哈尼族彝族自治县","墨江哈尼族自治县","景东彝族自治县","景谷傣族彝族自治县","镇沅彝族哈尼族拉祜族自治县","江城哈尼族彝族自治县","孟连傣族拉祜族佤族自治县","澜沧拉祜族自治县","西盟佤族自治县"]
            case "临沧":return ["临翔区","凤庆县","云县","永德县","镇康县","双江拉祜族佤族布朗族傣族自治县","耿马傣族佤族自治县","沧源佤族自治县"]
            case "楚雄彝族自治州":return ["楚雄市","双柏县","牟定县","南华县","姚安县","大姚县","永仁县","元谋县","武定县","禄丰县"]
            case "大理白族自治州":return ["大理市","漾濞彝族自治县","祥云县","宾川县","弥渡县","南涧彝族自治县","巍山彝族回族自治县","永平县","云龙县","洱源县","剑川县","鹤庆县"]
            case "红河哈尼族彝族自治州":return ["个旧市","开远市","蒙自市","屏边苗族自治县","建水县","石屏县","弥勒县","泸西县","元阳县","红河县","金平苗族瑶族傣族自治县","绿春县","河口瑶族自治县"]
            case "文山壮族苗族自治州":return ["文山市","砚山县","西畴县","麻栗坡县","马关县","丘北县","广南县","富宁县"]
            case "西双版纳傣族自治州":return ["景洪市","勐海县","勐腊县"]
            case "德宏傣族景颇族自治州":return ["瑞丽市","芒市","梁河县","盈江县","陇川县"]
            case "怒江傈僳族自治州":return ["泸水县","福贡县","贡山独龙族怒族自治县","兰坪白族普米族自治县"]
            case "迪庆藏族自治州":return ["香格里拉县","德钦县","维西傈僳族自治县"]
            /** 内蒙古 */
            case "呼和浩特":return ["新城区","回民区","玉泉区","赛罕区","土默特左旗","托克托县","和林格尔县","清水河县","武川县"]
            case "包头":return ["东河区","昆都仑区","青山区","石拐区","白云鄂博矿区","九原区","土默特右旗","固阳县","达尔罕茂明安联合旗"]
            case "乌海":return ["海勃湾区","海南区","乌达区"]
            case "赤峰":return ["红山区","元宝山区","松山区","阿鲁科尔沁旗","巴林左旗","巴林右旗","林西县","克什克腾旗","翁牛特旗","喀喇沁旗","宁城县","敖汉旗"]
            case "通辽":return ["科尔沁区","科尔沁左翼中旗","科尔沁左翼后旗","开鲁县","库伦旗","奈曼旗","扎鲁特旗","霍林郭勒市"]
            case "鄂尔多斯":return ["东胜区","达拉特旗","准格尔旗","鄂托克前旗","鄂托克旗","杭锦旗","乌审旗","伊金霍洛旗"]
            case "呼伦贝尔":return ["海拉尔区","阿荣旗","莫力达瓦达斡尔族自治旗","鄂伦春自治旗","鄂温克族自治旗","陈巴尔虎旗","新巴尔虎左旗","新巴尔虎右旗","满洲里市","牙克石市","扎兰屯市","额尔古纳市","根河市"]
            case "巴彦淖尔":return ["临河区","五原县","磴口县","乌拉特前旗","乌拉特中旗","乌拉特后旗","杭锦后旗"]
            case "乌兰察布":return ["集宁区","卓资县","化德县","商都县","兴和县","凉城县","察哈尔右翼前旗","察哈尔右翼中旗","察哈尔右翼后旗","四子王旗","丰镇市"]
            case "兴安盟":return ["乌兰浩特市","阿尔山市","科尔沁右翼前旗","科尔沁右翼中旗","扎赉特旗","突泉县"]
            case "锡林郭勒盟":return ["二连浩特市","锡林浩特市","阿巴嘎旗","苏尼特左旗","苏尼特右旗","东乌珠穆沁旗","西乌珠穆沁旗","太仆寺旗","镶黄旗","正镶白旗","正蓝旗","多伦县"]
            case "阿拉善盟":return ["阿拉善左旗","阿拉善右旗","额济纳旗"]
            /** 广西 */
            case "南宁":return ["兴宁区","青秀区","江南区","西乡塘区","良庆区","邕宁区","武鸣县","隆安县","马山县","上林县","宾阳县","横县"]
            case "柳州":return ["城中区","鱼峰区","柳南区","柳北区","柳江县","柳城县","鹿寨县","融安县","融水苗族自治县","三江侗族自治县"]
            case "桂林":return ["秀峰区","叠彩区","象山区","七星区","雁山区","阳朔县","临桂县","灵川县","全州县","兴安县","永福县","灌阳县","龙胜各族自治县","资源县","平乐县","荔蒲县","恭城瑶族自治县"]
            case "梧州":return ["万秀区","蝶山区","长洲区","苍梧县","藤县","蒙山县","岑溪市"]
            case "北海":return ["海城区","银海区","铁山港区","合浦县"]
            case "防城港":return ["港口区","防城区","上思县","东兴市"]
            case "钦州":return ["钦南区","钦北区","灵山县","浦北县"]
            case "贵港":return ["港北区","港南区","覃塘区","平南县","桂平市"]
            case "玉林":return ["玉州区","容县","陆川县","博白县","兴业县","北流市"]
            case "百色":return ["右江区","田阳县","田东县","平果县","德保县","靖西县","那坡县","凌云县","乐业县","田林县","西林县","隆林各族自治县"]
            case "贺州":return ["八步区","昭平县","钟山县","富川瑶族自治县"]
            case "河池":return ["金城江区","南丹县","天峨县","凤山县","东兰县","罗城仫佬族自治县","环江毛南族自治县","巴马瑶族自治县","都安瑶族自治县","大化瑶族自治县","宜州市"]
            case "来宾":return ["兴宾区","忻城县","象州县","武宣县","金秀瑶族自治县","合山市"]
            case "崇左":return ["江洲区","扶绥县","宁明县","龙州县","大新县","天等县","凭祥市"]
            /** 西藏 */
            case "拉萨":return ["城关区","林周县","当雄县","尼木县","曲水县","堆龙德庆县","达孜县","墨竹工卡县"]
            case "昌都地区":return ["昌都县","江达县","贡觉县","类乌齐县","丁青县","察雅县","八宿县","左贡县","芒康县","洛隆县","边坝县"]
            case "林芝地区":return ["林芝县","工布江达县","米林县","墨脱县","波密县","察隅县","朗县"]
            case "山南地区":return ["乃东县","扎囊县","贡嘎县","桑日县","琼结县","曲松县","措美县","洛扎县","加查县","隆子县","错那县","浪卡子县"]
            case "日喀则地区":return ["日喀则市","南木林县","江孜县","定日县","萨迦县","拉孜县","昂仁县","谢通门县","白朗县","仁布县","康马县","定结县","仲巴县","亚东县","吉隆县","聂拉木县","萨嘎县","岗巴县"]
            case "那曲地区":return ["那曲县","嘉黎县","比如县","聂荣县","安多县","申扎县","索县","班戈县","巴青县","尼玛县"]
            case "阿里地区":return ["普兰县","札达县","噶尔县","日土县","革吉县","改则县","措勤县"]
            /** 宁夏 */
            case "银川":return ["兴庆区","西夏区","金凤区","永宁县","贺兰县","灵武市"]
            case "石嘴山":return ["大武口区","惠农区","平罗县"]
            case "吴忠":return ["利通区","红寺堡区","盐池县","同心县","青铜峡市"]
            case "固原":return ["原州区","西吉县","隆德县","泾源县","彭阳县"]
            case "中卫":return ["沙坡头区","中宁县","海原县"]
            /** 海南 */
            case "海口":return ["秀英区","龙华区","琼山区","美兰区"]
            case "三亚":return [""]
            /** 台湾 */
            case "台北":return [""]
            case "高雄":return [""]
            case "基隆":return [""]
            case "台中":return [""]
            case "台南":return [""]
            case "新竹":return [""]
            case "嘉义":return [""]
                
            default:
                current_province = "直辖市"
                current_city = "北京"
                return beijing
            }
        }
    }
}

也可以使用json文件存储,作为资源放在App中,程序里根据一定规则读取文件,json 文件见:

https://codepen.io/acelibin/pen/wGooev

2、自定义视图 AddressBoxView.swift,以便灵活调用和个性化修改

具体内容如下所示:

import UIKit

//系统视图宽度
let K_APP_WIDTH = UIScreen.main.bounds.size.width

@objc protocol AddressBoxViewDelegate {
    /** 关闭(取消) */
    @objc optional func addressBoxCloseAction(sender:UIButton)

    /** 完成 */
    @objc optional func addressBoxFinishAction(sender:UIButton,selectValue:String)
}


/**
 * 地址选择弹框
 */
@objc class AddressBoxView: UIView,UIPickerViewDelegate,UIPickerViewDataSource {

    /** 省份 */
    @objc var province:String?

    /** 市 */
    @objc var city:String?
    
    /** 县 */
    @objc var county:String?

    @objc weak var delegate:AddressBoxViewDelegate?

    lazy var w = CGFloat.init(0)
    lazy var h = CGFloat.init(0)
    lazy var x = CGFloat.init(0)
    lazy var y = CGFloat.init(0)
    /** 修改此值可以控制是两级还是三级联动 */
    let list_cell_count = 3

    var btnOk:UIButton?                 //确定
    var btnCancle:UIButton?             //取消
    var topView:UIView?                 //顶部视图
    @objc var dataPicker:UIPickerView?  //数据选择器

    //MARK: - override func
    override init(frame: CGRect) {
        super.init(frame: frame)

        self.backgroundColor = UIColor.white

        //MARK: 顶部视图
        x = 0
        y = 0
        w = frame.size.width
        h = 45
        var rect = CGRect.init(x: x, y: y, width: w, height: h)
        topView = UIView.init(frame: rect)
        topView?.backgroundColor = UIColor.init().fromHexInt(0xfafafa, andAlpha: 1.0)
        self.addSubview(topView!)

        //MARK:关闭
        x = 0
        y = 0
        w = 80
        h = topView!.frame.size.height
        rect = CGRect.init(x: x, y: y, width: w, height: h)
        btnCancle = UIButton.init(frame: rect)
        btnCancle?.setTitle("关闭", for: .normal)
        btnCancle?.setTitleColor(UIColor.init().fromHexInt(0x007aff, andAlpha: 1.0), for: .normal)
        btnCancle?.titleLabel?.font = UIFont.init(name: "PingFangSC-Regular", size: 14)
        btnCancle?.addTarget(self, action: #selector(btnClose(sender:)), for: .touchUpInside)
        self.topView?.addSubview(btnCancle!)

        //MARK:完成
        w = 80
        h = topView!.frame.size.height
        x = topView!.frame.size.width - w
        rect = CGRect.init(x: x, y: y, width: w, height: h)

        btnOk = UIButton.init(frame: rect)
        btnOk?.setTitle("完成", for: .normal)
        btnOk?.setTitleColor(UIColor.init().fromHexInt(0x007aff, andAlpha: 1.0), for: .normal)
        btnOk?.titleLabel?.font = UIFont.init(name: "PingFangSC-Regular", size: 14)
        btnOk?.addTarget(self, action: #selector(btnFinishAction(sender:)), for: .touchUpInside)
        self.topView?.addSubview(btnOk!)

        //MARK:信息选择视图
        y = self.topView!.frame.size.height + self.topView!.frame.origin.y
        h = frame.size.height - y
        x = 0
        w = frame.size.width
        rect = CGRect.init(x: x, y: y, width: w, height: h)

        dataPicker = UIPickerView.init(frame: rect)
        dataPicker!.showsSelectionIndicator = true
        dataPicker!.backgroundColor = UIColor.clear
        dataPicker!.delegate = self
        dataPicker!.dataSource = self
        dataPicker!.tintColor = UIColor.white
        self.addSubview(dataPicker!)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    //MARK: - 刷新
    /**
     * @params isConstraint Bool 强制刷新
     */
    @objc func reload(isConstraint:Bool = false){
        //设置对应的选项
        var index:Int? = CountryCityModel.Province.index { return $0 == self.province }
        if index == nil { index = 0 }
        if isConstraint { index = 0 }
        dataPicker?.selectRow(index!, inComponent: 0, animated: true)
        CountryCityModel.current_province = CountryCityModel.Province[index!]
        dataPicker?.reloadComponent(1)
        

        index = CountryCityModel.City.index { return $0 == self.city }
        if index == nil { index = 0 }
        if isConstraint { index = 0 }
        dataPicker?.selectRow(index!, inComponent: 1, animated: true)
        CountryCityModel.current_city = CountryCityModel.City[index!]
        dataPicker?.reloadComponent(2)
        
        if list_cell_count > 2 {
            index = CountryCityModel.County.index { return $0 == self.county }
            if index == nil { index = 0 }
            if isConstraint { index = 0 }
            
            dataPicker?.selectRow(index!, inComponent: 2, animated: true)
            CountryCityModel.current_county = CountryCityModel.County[index!]
        }
    }


    //MARK: - 关闭
    @IBAction func btnClose(sender:UIButton) {
        if delegate != nil {
            delegate!.addressBoxCloseAction?(sender: sender)
        }
        print("关闭")
    }


    //MARK: - 完成
    @IBAction func btnFinishAction(sender:UIButton) {
        if delegate != nil {
            var strVal:String = String.init(format:"%@ %@",CountryCityModel.current_province,CountryCityModel.current_city)
            if list_cell_count > 2 {
                strVal = String.init(format:"%@ %@ %@",CountryCityModel.current_province,CountryCityModel.current_city,CountryCityModel.current_county)
            }
            delegate!.addressBoxFinishAction?(sender: sender, selectValue: strVal)
        }
        print("完成")
    }


    //MARK: - UIPickerViewDelegate,UIPickerViewDataSource
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return list_cell_count
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        //省份
        if component == 0 {
            return CountryCityModel.Province.count
        }
        //市
        else if component == 1 {
            return CountryCityModel.City.count
        }
        //县
        else if component == 2 {
            return CountryCityModel.County.count
        }

        return 0
    }

    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        if component == 0 {
            return K_APP_WIDTH * 0.25
        }
        else if component == 1 {
            return K_APP_WIDTH * 0.35
        }
        else if component == 2 {
            return K_APP_WIDTH * 0.40
        }
        return 0.0
    }

    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 34
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        //省份
        if component == 0 && row < CountryCityModel.Province.count {
            return CountryCityModel.Province[row]
        }
        //城市
        else if component == 1 && row < CountryCityModel.City.count {
            return CountryCityModel.City[row]
        }
        //县
        else if component == 2 && row < CountryCityModel.County.count {
            return CountryCityModel.County[row]
        }

        return "请选择"
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        //省份
        if component == 0 && row < CountryCityModel.Province.count {
            if CountryCityModel.Province[row] == CountryCityModel.current_province {
                return
            }

            //更新市
            var index:Int = pickerView.selectedRow(inComponent: 0)
            if CountryCityModel.Province.count < index { index = 0 }
            CountryCityModel.current_province = CountryCityModel.Province[index]
            pickerView.reloadComponent(1)

            //更新县
            CountryCityModel.current_city = CountryCityModel.City[pickerView.selectedRow(inComponent: 1)]
            pickerView.reloadComponent(2)
            
            if list_cell_count > 2 {
                index = pickerView.selectedRow(inComponent: 2)
                if CountryCityModel.County.count < index {index = 0}
                
                CountryCityModel.current_county = CountryCityModel.County[index]
            }
        }
        //市
        else if component == 1 && row < CountryCityModel.City.count {
            let index = pickerView.selectedRow(inComponent: 1)
            CountryCityModel.current_city = CountryCityModel.City[index]
            
            //更新县
            if list_cell_count > 2 {
                pickerView.reloadComponent(2)
            }
        }
        //县
        else if component == 2 && row < CountryCityModel.County.count {
            let index = pickerView.selectedRow(inComponent: 2)
            CountryCityModel.current_county = CountryCityModel.County[index]
        }
    }
}

3、在需要的地方调用 showAddressBox 方法(支持Obj-C)

具体使用参考如下:

//地址选择
@property(nonatomic,strong) AddressBoxView *addressBoxView;

-(AddressBoxView *)addressBoxView{
    if (!_addressBoxView) {
        CGFloat h = K_APP_CUSTOM_BOX_HEIGHT;
        CGFloat y = K_APP_HEIGHT - h;
        if ([[UIDevice currentDevice] isiPhoneX]) {
            y -= K_APP_IPHONEX_BUTTOM;
        }
        
        CGRect rect = CGRectMake(0, y, K_APP_WIDTH, h);
        _addressBoxView = [[AddressBoxView alloc] initWithFrame:rect];
        _addressBoxView.delegate = self;
    }
    
    return _addressBoxView;
}

/**
 * 显示地址选择
 * @param strOldValue String 已经选中的地址,不存在可为nil(省市县数据使用的 空格分割)
 * 在需要显示地址的地方调用此方法即可
 */ 
-(void)showAddressBox:(NSString *)strOldValue{
    if (strOldValue && ![strOldValue isEqualToString:@""]) {
        NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:@" "];
        NSArray *attTemp = [strOldValue componentsSeparatedByCharactersInSet:charSet];
        
        if (attTemp && [attTemp count] >= 2) {
            self.addressBoxView.province = [NSString stringWithFormat:@"%@",attTemp.firstObject];
            self.addressBoxView.city = [NSString stringWithFormat:@"%@",attTemp[1]];
            
            if ([attTemp count] >= 3) {
                self.addressBoxView.county = [NSString stringWithFormat:@"%@",attTemp.lastObject];
            }
            else{
                self.addressBoxView.county = @"";
            }
            
            [self.addressBoxView reloadWithIsConstraint:NO];
        }
    }
    else{
        [self.addressBoxView reloadWithIsConstraint:YES];
    }
    
    [self showListBox:self.addressBoxView];
}

/**
 * 该方法为附加方法,开源的自定义弹框组件
 * 具体使用参考:https://github.com/snail-z/zhPopupController.git
 */
-(void)showListBox:(UIView *)view{
    [self.zh_popupController setLayoutType:zhPopupLayoutTypeBottom];
    [self.zh_popupController setAllowPan:YES];
    [self.zh_popupController presentContentView:view];
}

4、通过实现 AddressBoxViewDelegate 可以关闭弹框 和 获取 当前选中的地址信息

以上信息就是这些并附上效果图,如有高见欢迎留言讨论

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追夢秋陽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值