2015-08-23 20:55:47 De_Moivre 阅读数 30
  • Swift不深入只浅出入门教程

    介绍Swift语言的基础知识,同时也是为了完成我原来一个github项目(https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground)上面写的录制一套视频教程的承诺。

    11911 人正在学习 去看看 孟祥月

    前言:

    本人买了苹果本好久了,虽然买回来就把著名的xcode安装好了,但是该软件一直都是在沉睡,今天试读swift,就顺便打开可爱的xcode写下了本机的第一个Hello world程序,也是本人的第一个swift程序 :)。

本来想要到网上查找下,写hello world的步骤,但是自己打开了xcode,各个选项都看了一下,发现和大学时候使用VS写c/c++程序差不多,顺利的找到commond line tool然后填写基本信息,运行,整个过程一气呵成。



 至此,本人的第一个ios/swift程序完成了。

 

------------------------试读开始-------------------------

Swift的发布时间: Swift是苹果公司在WWDC2014年,项开发者发布的一门新编程语言。Swift是可以用在苹果平台上的开发应用程序。说到苹果平台的开发语言就不得不说object-c语言,其实swift在设计之初,就考虑与object-c混合开发,swift相较于object-c,它得优点更突出:结合现代编程语言得特点,让应用程序开发更容易:

预防常见得编程错误,产出更具安全性得代码

利用清晰并富含表现力得愈发构建易于阅读的代码

与现有的objective-c框架兼容,包括cocoa和cocoa touch框架

 

试读的第一章主要介绍了wift的基本语法和基本数据类型。

swift的基本语法,包括:

使用var声明一个变量,let声明一个常量

利用if和switch语句有条件地执行代码块

利用for,for-in, while 和do-while语句重复执行代码块

 

基本语法:

  在swift中只需要一行代码就能完成著名得“hello world”:

println(“hello world”)

 

      大家可能会觉的这不是完整的程序代码,熟悉c或者java的开发者都知道,一个完整的程序,需要包含或者导入某个标准库,比如,配置一个初始化main()函数以供系统调用,但在swift程序中代码直接就进入了程序的核心部分,我们不需要任何配置,甚至不需要在每行代码的尾部包含一个分号,就像上面那样就完成了我们的第一个swift程序。

swift是一门强类型语言,并且类型之间不可以隐式地转换为另一种类型,这就意味着代码中不能将一个int和float值进行相加操作,如果需要这样做,首先要确保这2个值的类型相同,或者明确地将某一个的类型转换为另外一个值相同的类型,这样有助于swift成为一门具有安全性的编程语言。

 

   试读第七章介绍了swift和objective-c代码的相互转换,简单的说就是objectiv-c项目大部分可以直接转换为swift项目,甚至在一个项目中可以同时使用这2种语言进行开发,这对旧的项目迁移和新项目的兼容性是不可估量的好处。

 

后记: 希望自己利用业余时间能掌握了解swift技术,更新自己的技能库。

2018-01-31 16:05:24 u014220518 阅读数 4306
  • Swift不深入只浅出入门教程

    介绍Swift语言的基础知识,同时也是为了完成我原来一个github项目(https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground)上面写的录制一套视频教程的承诺。

    11911 人正在学习 去看看 孟祥月

用Swift写服务端 — Perfect框架学习(一)

一、Perfect简介

Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用及其它REST服务的解决方案,这样Swift工程师就可以实现同时在服务器和客户端上采用同一种语言开发软件项目。

由于建立在一个高性能异步网络引擎基础上,Perfect还能够在FastCGI上运行,支持安全套接字加密(SSL)。该软件体系还包含很多其它互联网服务器所需要的特点,包括WebSockets和iOS消息推送,而且很快会有更多强大的功能支持。


无论您是资深程序员还是入门级的软件工程师,本文都能够帮助您快速启动Perfect实现服务器项目开发运行。

二、Perfect项目快速上手

1.编译入门项目

我们在Perfect官网的git上直接下载一个入门项目。编译后就可以启动一个本地的服务,监听你的8181端口:

git clone https://github.com/PerfectlySoft/PerfectTemplate.git
cd PerfectTemplate
swift build
.build/debug/PerfectTemplate



我们可以在控制台看到以下内容:

Starting HTTP server on 0.0.0.0:8181 with document root ./webroot

服务器现在已经运行并等待连接。从浏览器打开http://localhost:8181/ 可以看到欢迎信息。


 在终端控制台中输入组合键“control-c”可以随时终止服务器运行。


2.Xcode管理

Swift软件包管理器(SPM)能够创建一个Xcode项目,并且能够运行PerfectTemplate模板服务器,还能为您的项目提供完全的源代码编辑和调试。在您的终端命令行内输入:

swift package generate-xcodeproj

然后打开产生的文件“PerfectTemplate.xcodeproj”,确定选择了可执行的目标文件,并选择在“我的Mac”运行。现在您可以运行并调试服务器了。



直接运行XCode,然后在浏览器中输入0.0.0.0:8181也是能直接运行的!

三、搭建HTTP服务器

编辑main.swift文件

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer

//HTTP服务
var routesArr = [Dictionary<String, Any>]()

var someDict1 : [String:String] = ["method":"GET","url":"/api"]

routesArr.append(someDict1)

let networkServer = NetworkServerManager(root: "webroot", port: 8080, routesArr: routesArr)

networkServer.startServer()
创建NetworkServerManager.swift文件

//
//  NetworkServerManager.swift
//  PerfectTemplatePackageDescription
//
//  Created by ZFJ on 2018/1/9.
//

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer

open class NetworkServerManager {
    fileprivate var server: HTTPServer
    internal init(root: String, port: UInt16, routesArr: Array<Dictionary<String, Any>>) {
        server = HTTPServer.init()                             //创建HTTPServer服务器
        for dict: Dictionary in routesArr {
            let baseUri : String = dict["url"] as! String      //跟地址
            let method : String = dict["method"] as! String    //方法
            var routes = Routes.init(baseUri: baseUri)         //创建路由器
            let httpMethod = HTTPMethod.from(string: method)
            configure(routes: &routes, method: httpMethod)     //注册路由
            server.addRoutes(routes)                           //路由添加进服务
        }
        server.serverName = "localhost"                        //服务器名称
        server.serverPort = port                               //端口
        server.documentRoot = root                             //根目录
        server.setResponseFilters([(Filter404(), .high)])      //404过滤
    }
    
    //MARK: 开启服务
    open func startServer() {
        do {
            print("启动HTTP服务器")
            try server.start()
        } catch PerfectError.networkError(let err, let msg) {
            print("网络出现错误:\(err) \(msg)")
        } catch {
            print("网络未知错误")
        }
        
    }
    
    //MARK: 注册路由
    fileprivate func configure(routes: inout Routes,method: HTTPMethod) {
        routes.add(method: .get, uri: "/selectUserInfor") { (request, response) in
            let path = request.path
            print(path)
            let jsonDic = ["hello": "world"]
            let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: jsonDic)
            response.setBody(string: jsonString)                           //响应体
            response.completed()                                           //响应
        }
        
//        if method == .get{
//            //get请求
//        }else if method == .post{
//            //post请求
//            let postParams = request.postParams
//            print(postParams)
//        }
    }
    
    //MARK: 通用响应格式
    func baseResponseBodyJSONData(code: Int, message: String, data: Any!) -> String {
        var result = Dictionary<String, Any>()
        result.updateValue(code, forKey: "code")
        result.updateValue(message, forKey: "message")
        if (data != nil) {
            result.updateValue(data, forKey: "data")
        }else{
            result.updateValue("", forKey: "data")
        }
        guard let jsonString = try? result.jsonEncodedString() else {
            return ""
        }
        return jsonString
    }
    
    //MARK: 404过滤
    struct Filter404: HTTPResponseFilter {
        func filterBody(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
            callback(.continue)
        }
        func filterHeaders(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
            if case .notFound = response.status {
                response.setBody(string: "404 文件\(response.request.path)不存在。")
                response.setHeader(.contentLength, value: "\(response.bodyBytes.count)")
                callback(.done)
            } else {
                callback(.continue)
            }
        }
        
    }
}














运行结果




接口访问


四、搭建MySql服务器

我的电脑上安装的有Homebrew,所以我直接通过Homebrew安装MySql,安装命令:

brew install mysql

配置MySql

#开启MySQL服务
mysql.server start
#初始化MySQL配置向导
mysql_secure_installation
我电脑上数据库已经而配置好了,这里面我就不演示了,如果有不了解的可以加我QQ或者QQ群;


五、安装Navicat Premium

Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便。


Navicat Premium_12.0.22破解版下载


这里面下载好了以后会让你输入安装密码,密码为:xclient.info 

如下图:


安装成功以后如果打开出现如下图的错误,只需要在终端输入以下代码就好;


执行以下命令开启
sudo spctl --master-disable


这样就可以打开了,然后链接MySQL数据库,如下图


然后创建数据库userInforsTable,然后创建了一个userTable表,并向userTable表中添加了三条数据;如下图:


这样你就可以操作MySQL数据库了,当然你也可以通过终端直接操作数据库;


六、编辑Perfect服务端

创建DataBaseManager.swift数据库管理类,在这里我们对数据库进行增删改查操作;

//
//  DataBaseManager.swift
//  PerfectTemplatePackageDescription
//
//  Created by ZFJ on 2018/1/17.
//

import MySQL

//MARK: 数据库信息
let mysql_host = "127.0.0.1"
let mysql_user = "root"
let mysql_password = "12345678"
let mysql_database = "userInforsTable"

//MARK: 表信息
let userTable = "userTable"                    //用户信息表

open class DataBaseManager {
    fileprivate var mysql : MySQL
    internal init() {
        mysql = MySQL.init()                       //创建MySQL对象
        guard connectDataBase() else{            //开启MySQL连接
            return
        }
    }
    
    //MARK:开启链接
    private func connectDataBase() -> Bool{
        let connected = mysql.connect(host: mysql_host, user: mysql_user, password: mysql_password, db: mysql_database)
        guard connected else{
            print("MySql链接失败" + mysql.errorMessage())
            return false
        }
        print("MySql链接成功")
        return true
    }
    
    //MARK: 执行SQL语句
    /// 执行SQL语句
    ///
    /// - Parameter sql: sql语句
    /// - Returns: 返回元组(success:是否成功 result:结果)
    @discardableResult
    func mysqlStatement(_ sql:String) -> (success:Bool,mysqlResult:MySQL.Results?,errorMsg:String) {
        guard mysql.selectDatabase(named:mysql_database) else {
            //指定操作的数据库
            let msg = "未找到\(mysql_database)数据库"
            print(msg)
            return(false, nil, msg)
        }
        
        let successQuery = mysql.query(statement:sql) //sql语句
        guard successQuery else{
            let msg = "SQL失败:\(sql)"
            print(msg)
            return(false, nil, msg)
        }
        let msg = "SQL成功:\(sql)"
        print(msg)
        return (true, mysql.storeResults(), msg)                            //sql执行成功
    }
    
    /// 增
    ///
    /// - Parameters:
    ///   - tableName: 表
    ///   - keyValueDict: 键:值 对字典
    func insertDataBaseSQL(tableName:String, keyValueDict:Dictionary<String, Any>) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
        var keys: [String] = []
        var values: [String] = []
        for (key, value) in keyValueDict {
            if let str = value as? String {
                keys.append(key)
                values.append(str)
            }
        }
        let fieldNameAll: String = keys.joined(separator: ",")
        let valueAll: String = values.joined(separator: ",")
        let SQL = "insert into \(tableName)(\(fieldNameAll)) values(\(valueAll))"
        return mysqlStatement(SQL)
    }
    
    /// 删
    ///
    /// - Parameters:
    ///   - tableName: 表
    ///   - key: 键
    ///   - value: 值
    func deleteDatabaseSQL(tableName: String, key: String, value: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
        
        let SQL = "DELETE FROM \(tableName) WHERE \(key) = '\(value)'"
        return mysqlStatement(SQL)
        
    }
    
    /// 改
    ///
    /// - Parameters:
    ///   - tableName: 表
    ///   - keyValue: 键值对( 键='值', 键='值', 键='值' )
    ///   - whereKey: 查找key
    ///   - whereValue: 查找value
    func updateDatabaseSQL(tableName: String, keyValue: String, whereKey: String, whereValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
        
        let SQL = "UPDATE \(tableName) SET \(keyValue) WHERE \(whereKey) = '\(whereValue)'"
        return mysqlStatement(SQL)
        
    }
    
    /// 查所有
    ///
    /// - Parameters:
    ///   - tableName: 表
    ///   - key: 键
    func selectAllDatabaseSQL(tableName: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
        
        let SQL = "SELECT * FROM \(tableName)"
        return mysqlStatement(SQL)
        
    }
    
    /// 查
    ///
    /// - Parameters:
    ///   - tableName: 表
    ///   - keyValue: 键值对
    func selectAllDataBaseSQLwhere(tableName: String, keyValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
        
        let SQL = "SELECT * FROM \(tableName) WHERE \(keyValue)"
        return mysqlStatement(SQL)
        
    }
    
    //获取表中所有数据
    func mysqlGetHomeDataResult() -> [Dictionary<String, String>]? {
        let result = selectAllDatabaseSQL(tableName: userTable)
        var resultArray = [Dictionary<String, String>]()
        var dic = [String:String]()
        result.mysqlResult?.forEachRow(callback: { (row) in
            dic["userid"] = row[0]
            dic["userNumber"] = row[1]
            dic["userName"] = row[2]
            dic["userSex"] = row[3]
            dic["userBirthday"] = row[4]
            resultArray.append(dic)
        })
        return resultArray
        
    }
}

然后在NetworkServerManager中调用DataBaseManager,注册子路由/selectUserInfor查询用户表里的所以信息;

    //MARK: 注册路由
    fileprivate func configure(routes: inout Routes,method: HTTPMethod) {
        routes.add(method: .get, uri: "/selectUserInfor") { (request, response) in
            let path = request.path
            print(path)
//            let jsonDic = ["hello": "world"]
//            let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: jsonDic)
//            response.setBody(string: jsonString)                           //响应体
//            response.completed()                                           //响应
            let queryParams = request.queryParams
            if queryParams.count == 0{
                let result = DataBaseManager().mysqlGetHomeDataResult()
                let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: result)
                response.setBody(string: jsonString)
                response.completed()
            }else{
                //有参数
                //let value : String
                for i in 0...queryParams.count - 1{
                    let partArr = queryParams[i]
                    print(partArr)
                }
                let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: nil)
                response.setBody(string: jsonString)
                response.completed()
            }
        }
    }
    
然后调取接口访问数据http://0.0.0.0:8080/api/selectUserInfor;如下图:


注意事项

1.如果你在NetworkServerManager中无法调用DataBaseManager,或者说调用DataBaseManager查找不到,那是因为你创建DataBaseManager的时候没有选择在项目中引用,默认选择了第一个第三方库了;


如果你创建完成只需要稍微修改一下就好;


2.如果提示MySQL找不到,那是因为你的工程中,或者我们开始下载的那个示例工程没有导入MySQL,你需要引用一下就好;

首先修改Package.swift文件,引用https://github.com/PerfectlySoft/Perfect-MySQL.git 

示例如下:

import PackageDescription

let package = Package(
    name: "PerfectTemplate",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 3),
        .Package(url: "https://github.com/PerfectlySoft/Perfect-MySQL.git", majorVersion: 2),
    ]
)
然后删除PerfectTemplate.xcodeproj文件, 接着终端重新生成PerfectTemplate.xcodeproj文件,最后打开工程就会发现MySQL库了,如下图:


DEMO下载

结束语

欢迎大家加移动开发技术交流群,在这里大家可以一起讨论学习,这里有大佬,也有小菜鸟,没事还能斗斗图装装逼,如果需要换工作的还能相互推荐,期待大家的加入!大笑偷笑


                                                             

                












2016-10-20 16:37:22 u014220518 阅读数 9602
  • Swift不深入只浅出入门教程

    介绍Swift语言的基础知识,同时也是为了完成我原来一个github项目(https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground)上面写的录制一套视频教程的承诺。

    11911 人正在学习 去看看 孟祥月

今天我发现了一个很吊的软件,对于那些swift不熟悉的小伙伴来说就是福利啊,他可以将你写的OC代码转化为swift代码,废话不多说,直接上图:


软件的名称叫做:iSwift,软件的logo如下,

下载地址:http://www.pc6.com/mac/165862.html



2015-01-30 16:04:29 liulicsdn 阅读数 1795
  • Swift不深入只浅出入门教程

    介绍Swift语言的基础知识,同时也是为了完成我原来一个github项目(https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground)上面写的录制一套视频教程的承诺。

    11911 人正在学习 去看看 孟祥月
最近在用swift 开发软件,但是iOS8要求更加严格,以前获取字符串的宽度的方法,都不能用,自己写了个,虽然很简单,但是希望和大家分享。
<span style="font-size:18px;"> // MARK:返回字符串的宽度
    
    func returnWidth(string:NSString) -> CGFloat {
        
        let size: CGSize = string.sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(16.0)])
        return size.width
    }
</span>

2017-10-17 00:06:36 wang631106979 阅读数 1832
  • Swift不深入只浅出入门教程

    介绍Swift语言的基础知识,同时也是为了完成我原来一个github项目(https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground)上面写的录制一套视频教程的承诺。

    11911 人正在学习 去看看 孟祥月

自从Xcode8之后就不支持插件了,没法用Xcode一键生成AppIcon,一直没找到好的解决方案,一怒之下决定自己写一个脚本用来生成AppIcon,下面是正文,小弟抛砖引玉,有写的不好的地方有请大佬们见谅:

源码地址

事前准备

查看swift版本

首先你要确定你的Mac上的swift版本:

swift --version

我电脑上的执行结果是这样的:

Apple Swift version 4.0 (swiftlang-900.0.65 clang-900.0.37)
Target: x86_64-apple-macosx10.9

然后就可以用Xcode建一个swift文件来编写swift脚本了,不过单独建一个swift文件,Xcode编辑起来非常不友好,我的方案是建一个在Mac上运行的Command Line Tool工程,这样的话有代码提示,要不然写起来太痛苦,如果大佬们有更好的办法,可以指导一下小弟。

swift脚本编程小知识

终端输入和输出

刚入手脚本我们第一件事前就应该了解在终端如何进行输入和输出,下面是输入和输出的办法:

输出

输入很简单,大家也很熟悉,就是print,下面是代码示例:

print("Hello world!")

然后大家可以执行以下试试(test.swift是你的文件名):

swift test.swift

执行后就能在终端上看到一行字:Hello world!

这样子我们的第一个swift脚本就完成了。

输入

知道了怎么输出我们还得知道怎么输入,输入也非常简单,下面是代码示例:

print("请输入文字:")
if let input = readLine() {
    print("你输入的文字:\(input)")
}

执行之后显示的结果:

请输入文字:
Hello world!
你输入的文字:Hello world!

这样输入也完成了,我们也算swift脚本编程入门了。

在swift脚本中调用其他命令

我们经常用的命令有很多,比如echo、mkdir、cd等等,我们能不能在swift中直接调用呢,答案是可以的,下面我们用简单的例子来了解一下,大家想深入的话可以去研究一下传送门

import Foundation

func execute(path: String, arguments: [String]? = nil) -> Int {
    let process = Process()
    process.launchPath = path
    if arguments != nil {
        process.arguments = arguments!
    }
    process.launch()
    process.waitUntilExit()
    return Int(process.terminationStatus)

}

let status = execute(path: "/bin/ls")
print("Status = \(status)")

以上的脚本相当于在终端中执行了ls命令,如果大家不知道命令的路径的话,可以用where查找一下,例如:

where ls

这是执行后的结果:

ls: aliased to ls -G
/bin/ls

这里的/bin/ls就是ls命令的路径。

开始编写脚本

读取input.png

首先我们要从将需要转化的图片读取出来,下面是主要代码:

import Foundation

let inputPath = "input.png"
let inoutData = try Data(contentsOf: url)
print("图片大小:\(inoutData.count / 1024) kb")
let dataProvider = CGDataProvider(data: inoutData as CFData)
if let inputImage = CGImage(pngDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) {
    /// inputImage就是需要转化的图片
}else {
    print("转换失败,图片必须是png格式")
}

生成AppIcon.appiconset和Contents.json

这里就设计到文件操作了,用FileManager就行了,相信大家已经轻车熟路了,我就贴一些主要代码,大家看完整版去我的github源码看就行了:

import Foundation

/// AppIcon的model
struct AppIconImageItem: Codable {
    let size: String
    let idiom: String
    let filename: String
    let scale: String
    let role: String?
    let subtype: String?
}

struct AppIconInfo: Codable {
    let version: Int
    let author: String
}

struct AppIcon: Codable {
    var images: [AppIconImageItem]
    let info: AppIconInfo
}


/// 创建contentsJson
///
/// - Parameter appIcon: 传入的appIcon
func createAppIconContentsJson(appIcon: AppIcon) {
    print("\n开始生成contentsJson\n")
    let encoder = JSONEncoder()
    do {
        encoder.outputFormatting = .prettyPrinted
        let appIconData = try encoder.encode(appIcon)
        if let appIconStr  = String.init(data: appIconData, encoding: .utf8) {
            let contentJsonPath = "AppIcon.appiconset/Contents.json"
            let contentJsonUrl = URL(fileURLWithPath: contentJsonPath)
            try appIconStr.write(to: contentJsonUrl, atomically: true, encoding: .utf8)
            print("contentsJson生成成功\n")
        }else {
            print("contentsJson生成失败")
        }
    }catch {
        print(error.localizedDescription)
    }
}

/// 创建appicon文件
///
/// - Parameter appIcon: appicon
func createFile(appIcon: AppIcon, image: CGImage) {
    let fileManager = FileManager.default
    let filePath = "AppIcon.appiconset"
    do {
        if fileManager.fileExists(atPath: filePath) {
            try fileManager.removeItem(atPath: filePath)
        }
        try fileManager.createDirectory(atPath: filePath, withIntermediateDirectories: true, attributes: nil)
        createAppIconContentsJson(appIcon: appIcon)
        print("~~~~~~~~~~~~~~完成~~~~~~~~~~~~~~")
    }catch {
        print("文件目录\(filePath)创建失败")
        print(error.localizedDescription)
    }
}

生成不同尺寸的image

生成图片我们用的是Foundation框架里面的Core Graphics框架,下面是主要代码:

import Foundation


/// 生成单个image
///
/// - Parameters:
///   - size: 图片的size
///   - scale: 倍数,例如@2x就是2倍
///   - filename: 文件名
func createImage(size: CGSize, scale: CGFloat, image: CGImage, filename: String) {
    print("开始生成图片: \(filename)")
    let width  = Int(size.width * scale)
    let height = Int(size.height * scale)
    let bitsPerComponent = image.bitsPerComponent
    let bytesPerRow = image.bytesPerRow
    let colorSpace  = image.colorSpace

    if let context = CGContext.init(data: nil,
                                    width: width,
                                    height: height,
                                    bitsPerComponent: bitsPerComponent,
                                    bytesPerRow: bytesPerRow,
                                    space: colorSpace!,
                                    bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) {
        context.interpolationQuality = .high
        context.draw(image, in: .init(origin: .zero, size: .init(width: width, height: height)))
        if let inputImage = context.makeImage() {
            let outputImagePath = "AppIcon.appiconset/\(filename)"
            let outputUrl = URL(fileURLWithPath: outputImagePath) as CFURL
            let destination = CGImageDestinationCreateWithURL(outputUrl, kUTTypePNG, 1, nil)
            if let destination = destination {
                CGImageDestinationAddImage(destination, inputImage, nil)
                if CGImageDestinationFinalize(destination) {
                    print("图片: \(filename) 生成成功\n")
                }else {
                    print("图片: \(filename) 生成失败\n")
                }
            }
        }else {
            print("图片: \(filename) 生成失败\n")
        }
    }
}

最后给大家贴以下完成的截图:

上面只是一部分主要代码,完整的代码太多了,大家可以去我的github地址上去下载执行以下试试,如果有什么做的不好的地方,欢迎大家指教~~

没有更多推荐了,返回首页