首页 文章 精选 留言 我的

精选列表

搜索[Swift开发],共10011篇文章
优秀的个人博客,低调大师

iOS - Swift Struct 结构体

1、Struct 的创建 1.1 基本定义 结构体的定义 // 定义结构体数据类型 struct BookInfo { // 每个属性变量都必须初始化 var ID:Int = 0 var Name:String = "Default" var Author:String = "Default" var RootType:String = "Default" } 结构体的使用 // 定义结构体变量 let book = BookInfo() // 结构体类型变量值的调用 print("\(book.ID), \(book.Name), \(book.Author), \(book.RootType)") 1.2 含方法的定义 结构体的定义 // 定义结构体数据类型 struct markStruct { var mark1:Int var mark2:Int var mark3:Int // 初始化方法 init(mark1:Int, mark2:Int, mark3:Int) { // 每个属性变量都必须初始化 self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } // 方法定义 func sum(a:Int) -> Int { return (self.mark1 + self.mark2 + self.mark3) * a } } 结构体的使用 // 定义结构体变量 let mark = markStruct(mark1: 11, mark2: 22, mark3: 33) // 结构体类型变量值的调用 print("\(mark.mark1), \(mark.mark2), \(mark.mark3)") // 结构体类型方法的调用 print(mark.sum(2))

优秀的个人博客,低调大师

iOS - Swift NSEnumerator 迭代器

前言 public class NSEnumerator : NSObject, NSFastEnumeration 1、迭代器 let arr:NSArray = ["bei", "jing", "huan", "ying", "nin"] let dic:NSDictionary = ["key1":"value1", "key2":"value2", "key3":"value3"] // 创建数组 正序 迭代器 let arrEnumer1:NSEnumerator = arr.objectEnumerator() // 创建数组 反序 迭代器 let arrEnumer2:NSEnumerator = arr.reverseObjectEnumerator() // 创建字典 key 迭代器 let dicKeyEnumer:NSEnumerator = dic.keyEnumerator() // 创建字典 对象 迭代器 let dicObjEnumer:NSEnumerator = dic.objectEnumerator() // 获取迭代器中下一个对象 var obj: AnyObject? = arrEnumer1.nextObject() obj = arrEnumer1.nextObject() // 获取迭代器中所有对象 let array = arrEnumer2.allObjects 2、数组用迭代器遍历 let arr:NSArray = ["bei", "jing", "huan", "ying", "ni"] let enu1:NSEnumerator = arr.objectEnumerator() let enu2:NSEnumerator = arr.reverseObjectEnumerator() // AnyObject 后不要加 ?,否则会导致一直循环 while let obj:AnyObject = enu1.nextObject() { print(obj) } // AnyObject 后不要加 ?,否则会导致一直循环 while let obj:AnyObject = enu2.nextObject() { print(obj) } 3、集合用迭代器遍历 let nsSet:NSSet = [2, 4, 6, 8] let enu:NSEnumerator = nsSet.objectEnumerator() // AnyObject 后不要加 ?,否则会导致一直循环 while let obj:AnyObject = enu.nextObject() { print(obj) } 4、字典用迭代器遍历 let nsDic:NSDictionary = NSDictionary(dictionary: ["key1":1, "key2":2, "key3":3, "key4":4]) // key 迭代器 let keyEnu:NSEnumerator = nsDic.keyEnumerator() while let key:AnyObject = keyEnu.nextObject() { print(nsDic.objectForKey(key)) } // 对象迭代器 let objEnu:NSEnumerator = nsDic.objectEnumerator() while let obj:AnyObject = objEnu.nextObject() { print(obj) }

优秀的个人博客,低调大师

iOS - Swift NSFileManage 文件管理

前言 public class NSFileManager : NSObject public class NSFileHandle : NSObject, NSSecureCoding NSFileManager 是 Foundation 框架中用来管理和操作文件、目录等文件系统相关联内容的类。 1、路径操作 let nfManager = NSFileManager.defaultManager() let folderUrl:NSURL = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop/testFolder"))! let filerUrl:NSURL = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))! let srcUrl:NSURL = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))! let dstUrl:NSURL = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop/testFolder/testFile.txt"))! // 创建文件夹 /* public func createDirectoryAtPath(path: String, withIntermediateDirectories createIntermediates: Bool, attributes: [String : AnyObject]?) throws path:文件夹路径 createIntermediates:是否连同上一级路径一起创建,NO 并且上一级文件路径不存在时会创建失败。 attributes:文件夹属性,nil 系统默认属性 */ try! nfManager.createDirectoryAtPath(folderUrl.path!, withIntermediateDirectories: true, attributes: nil) // 创建文件 /* func createFileAtPath(path: String, contents data: NSData?, attributes attr: [NSObject : AnyObject]?) -> Bool path:文件路径 data:文件内容,nil 空 attr:文件属性,nil 系统默认属性 Bool:文件创建成功时返回值为 true */ let bl1:Bool = nfManager.createFileAtPath(filerUrl.path!, contents: nil, attributes: nil) // 拷贝文件 /* 如果 dstUrl 路径文件已存在,该方法会终止拷贝,并返回 false。 如果 srcUrl 的最后一部分是符号链接,那么只有链接会被拷贝到新路径。 */ try! nfManager.copyItemAtPath(srcUrl.path!, toPath: dstUrl.path!) // 删除文件 /* 删除成功或者 url 为 nil 时返回 true,如果发生错误返回 false。如果使用 delegate 终止了删除文件的操作, 则返回 true,如果使用 delegate 终止了删除目录的操作,则返回 false。 */ try! nfManager.removeItemAtPath(dstUrl.path!) // 移动文件 /* 如果 dstUrl 路径文件已存在,该方法会终止移动,并返回 false。如果 srcUrl 的最后一部分是符号链接, 那么只有链接会被移动到新路径。链接所指向的内容仍然保持在现有的位置。 */ try! nfManager.moveItemAtPath(srcUrl.path!, toPath: dstUrl.path!) // 查找满足指定条件的路径 // 返回其 URL。该方法不但可以获得标准系统目录,还可以用来创建临时路径。 let url1:NSURL = try! nfManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) // 返回所有满足条件的路径列表 let urlObjs:[NSURL] = nfManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) let url2:NSURL = urlObjs[0] // 查询指定路径下的所有子路径 let urls1:[String]? = nfManager.subpathsAtPath(url1.path!) let urls2:[String] = try! nfManager.subpathsOfDirectoryAtPath(url1.path!) // 浅遍历 // 返回指定目录下的文件、子目录及符号链接的列表 let contentsDir1:[String] = try! nfManager.contentsOfDirectoryAtPath(url1.path!) // 返回文件全路径 /* public func contentsOfDirectoryAtURL(url: NSURL, includingPropertiesForKeys keys: [String]?, options mask: NSDirectoryEnumerationOptions) throws -> [NSURL] 返回指定目录下的文件、子目录及符号链接的列表,返回的是文件全路径。 url:要进行搜索的目录路径,该路径不能为指向目标目录的符号链接,如果是可以使用 URLByResolvingSymlinksInPath 进行转换。 keys:用来传入进行搜索的一些特定条件,包括创建时间,修改时间等。 mask:SkipsHiddenFiles:表示不遍历隐藏文件, SkipsSubdirectoryDescendants:表示不递归到子目录内部, SkipsPackageDescendants:表示不递归到包内部。 */ let contentsDir2:[NSURL] = try! nfManager.contentsOfDirectoryAtURL(url1, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles) // 深遍历 // 返回指定目录下的所有文件及其子目录下的所有元素路径 let enumeratorDir1:NSDirectoryEnumerator = nfManager.enumeratorAtPath(url1.path!)! // 返回文件全路径 /* func enumeratorAtURL(url: NSURL, includingPropertiesForKeys keys: [AnyObject]?, options mask: NSDirectoryEnumerationOptions, errorHandler handler: ((NSURL!, NSError!) -> Bool)?) -> NSDirectoryEnumerator? 返回指定目录下的所有文件及其子目录下的所有元素路径,返回的是文件全路径。 url:要进行搜索的目录路径,该路径不能为指向目标目录的符号链接,如果是可以使用 URLByResolvingSymlinksInPath 进行转换。 keys:用来传入进行搜索的一些特定条件,包括创建时间,修改时间等。 mask:SkipsHiddenFiles:表示不遍历隐藏文件, SkipsSubdirectoryDescendants:表示不递归到子目录内部, SkipsPackageDescendants:表示不递归到包内部。 */ let enumeratorDir2:NSDirectoryEnumerator = nfManager.enumeratorAtURL(url1, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles, errorHandler: nil)! // 枚举遍历深层遍历 let dEnu:NSDirectoryEnumerator? = nfManager.enumeratorAtPath(url1.path!) while let obj:AnyObject? = dEnu?.nextObject() { print(obj) } // 显示路径的本地化名称 /* 如果指定的文件或目录不存在,会返回 path 本身。 */ let displayName:String = nfManager.displayNameAtPath(url1.path!) // 获取指定路径的各种属性 let attributes:[String:AnyObject] = try! nfManager.attributesOfItemAtPath(url1.path!) // 获取指定路径文件的内容数据 /* 如果指定路径为目录或发生错误,返回 nil。 */ let data:NSData? = nfManager.contentsAtPath(url1.path!.stringByAppendingString("/test.txt")) // 获取当前路径 let currentPath:String = nfManager.currentDirectoryPath // 更改当前路径 /* /Users/JHQ0228/Desktop/Debug */ let bl6:Bool = nfManager.changeCurrentDirectoryPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug")) // 获取临时工作路径 /* 获取系统中可以用来创建临时文件的目录路径名,一定要在完成任务之后将在其中创建的文件删除。 */ let tempPath:NSString = NSTemporaryDirectory() // 获取用户主路径(沙盒路径) let homePath:NSString = NSHomeDirectory() // 获取指定用户的主路径 /* NSUserName(); 获取当前用户的登录名。NSFullUserName(); 获取当前用户完整用户名 */ let userHomePath:String? = NSHomeDirectoryForUser(NSUserName()) // 获取用户 Documents 路径 let documentPath:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] // 获取 app 包路径 let bundlePath = NSBundle.mainBundle().bundlePath // 创建一个新路径 try! nfManager.createDirectoryAtPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug1"), withIntermediateDirectories: true, attributes: nil) // 获取最后一个路径 let lastPath:String? = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop"))?.lastPathComponent // 删除最后一个路径 let deleteLastPath:String? = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop"))? .URLByDeletingLastPathComponent? .path // 拼接一个路径 let appendingPath:String? = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop"))? .URLByAppendingPathComponent("testFolder") .path // 文件路径分割 let pathArray:[String]? = NSURL(string: NSHomeDirectory().stringByAppendingString("/Desktop"))?.pathComponents // 文件路径组合 let pathString:NSString = NSString.pathWithComponents(pathArray!) // 将路径中的代字符 ~ 扩展成用户主目录或指定用户的主目录 // 特殊的代字符 ~ 是用户主目录(如:/Users/JHQ0228)的缩写,~linda 表示用户 linda 主目录的缩写。 let path1:NSString = "~/Desktop/test.txt"; // /Users/JHQ0228/Desktop/test.txt let mainPath:String = path1.stringByExpandingTildeInPath // 解析路径中的符号链接 /* /.. 上一级目录 */ let path2:NSString = "~/../Debug" let appPath1:String = path2.stringByResolvingSymlinksInPath // 通过解析 ~(用户主目录)、..(父目录) 、.(当前目录)和符号链接来标准化路径 /* NSHomeDirectory()/.. NSHomeDirectory() 的上一级目录 */ let path3:NSString = NSString(format:"%@/../Debug", NSHomeDirectory()) let appPath2:String = path3.stringByStandardizingPath // 获取文件拓展名 let getExtension:String? = NSURL(string: "/Desktop/test.txt")?.pathExtension // 删除文件拓展名 let deleteExtension:String? = NSURL(string: "/Desktop/test.txt")?.URLByDeletingPathExtension?.pathExtension // 拼接文件拓展名 let appendingExtension:String? = NSURL(string: "/Desktop/test.txt")?.URLByAppendingPathExtension("doc").path 2、路径判断 let nfManager = NSFileManager.defaultManager() let url1:NSURL = try! nfManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) // 判断路径是否存在 /* 如果当前路径以~开头,需使用 NSString 的 stringByExpandingTildeInPath 方法进行处理,否则会返回 false */ let bl1:Bool = nfManager.fileExistsAtPath(url1.path!) // 判断指定路径是否有可读权限 let bl2:Bool = nfManager.isReadableFileAtPath(url1.path!) // 判断指定路径是否有可写权限 let bl3:Bool = nfManager.isWritableFileAtPath(url1.path!) // 判断指定路径是否有可执行权限 let bl4:Bool = nfManager.isExecutableFileAtPath(url1.path!) // 判断指定路径是否有可删除权限 let bl5:Bool = nfManager.isDeletableFileAtPath(url1.path!) // 判断两个指定路径的内容是否相同 let bl6:Bool = nfManager.contentsEqualAtPath(url1.path!, andPath: url1.path!.stringByAppendingString("/test.txt")) 3、文件操作 let fileUrl:NSURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as! NSURL // 文件打开 // 读写 var nfHandle = NSFileHandle(forUpdatingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))! // 只读 var nfHandle1 = NSFileHandle(forReadingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))! // 只写 var nfHandle2 = NSFileHandle(forWritingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))! // 文件句柄偏移量 // 获取文件句柄指针的偏移量 let offSetNum1:UInt64 = nfHandle.offsetInFile // 将偏移量移到文件末尾,返回移动后的指针偏移量 let offSetNum2:UInt64 = nfHandle.seekToEndOfFile() // 将偏移量指向特定的位置 nfHandle.seekToFileOffset(0) // 文件读取 // 获取当前文件句柄的可用数据,获取后指针移到文件末尾 let availableData:NSData = nfHandle.availableData // 获取从当前指针位置到文件结束的所有数据,获取后指针移到文件末尾 let data1:NSData = nfHandle.readDataToEndOfFile() // 获取从当前指针位置开始读取的 length 长度的数据内容,获取后指针移到文件读取到的位置 let data2:NSData = nfHandle.readDataOfLength(10) // 文件写入 // 从当前指针位置写入数据到文件 nfHandle.writeData("你好".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) // 文件关闭 // 关闭文件 nfHandle.closeFile() // 文件比较 let nfManager = NSFileManager.defaultManager() // 文件路径 let filePath1:String = NSHomeDirectory().stringByAppendingString("/Desktop/file1.txt") let filePath2:String = NSHomeDirectory().stringByAppendingString("/Desktop/file2.txt") nfManager.createFileAtPath(filePath1, contents: "北京欢迎您".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true), attributes: nil) nfManager.createFileAtPath(filePath2, contents: "北京欢迎".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true), attributes: nil) // 比较两个文件的内容是否相等 let bl:Bool = nfManager.contentsEqualAtPath(filePath1, andPath: filePath2)

优秀的个人博客,低调大师

iOS - Swift PList 数据存储

前言 直接将数据写在代码里面,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低。因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码。一般可以使用属性列表文件存储 NSArray 或者 NSDictionary 之类的数据,这种 “属性列表文件” 的扩展名是 plist,因此也称为 “plist 文件”。 plist 是以 xml 文件形式存储的。 如果对象是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 类型,可以用这些类中实现的 writeToFile: atomically: 方法将数据写到文件中。 当根据字典创建属性列表时,字典中的键必须都是 NSString 对象。数组中的元素或字典中的值可以是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 对象。 iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。 1、Write 写入方式 永久保存在磁盘中。具体方法为: 第一步:获得文件即将保存的路径: 使用 C 函数 NSSearchPathForDirectoriesInDomains 来获得沙盒中目录的全路径。该函数有三个参数,目录类型、domain mask、布尔值。其中布尔值表示是否需要通过 ~ 扩展路径。而且第一个参数是不变的,即为 NSSearchPathDirectory 。在 iOS 中后两个参数也是不变的,即为:.DocumentDirectory 和 true。 let documentPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 还有一种方法是使用 NSHomeDirectory 函数获得 sandbox 的路径,但是不能在 sandbox 的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如 Documents, Library 或者 temp 。具体的用法为: // 将 Documents 添加到 sandbox 路径上 let documentPath = NSHomeDirectory().stringByAppendingString("/Documents") 这两者的区别就是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 后面添加 Documents 更加安全。因为该文件目录可能在未来发送的系统上发生改变。 第二步:生成在该路径下的文件: objc // fileName 就是保存文件的文件名 let FileName = documentPath.stringByAppendingString("/fileName") 第三步:往文件中写入数据: // 将 NSData 类型对象 data 写入文件,文件名为 FileName data.writeToFile(FileName, atomically: true) 第四步:从文件中读出数据: // 从 FileName 中读取出数据 let data = try? NSData(contentsOfFile: FileName, options: NSDataReadingOptions(rawValue: 0)) 2、Plist 文件的读写 let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayToPList.plist") let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryToPList.plist") // 待写入数据 let array:NSArray = ["bei", "jing", "huan", "ying", "nin"] // 待写入数据 let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"] // 写 Plist 文件 // 数组写入 plist 文件 let bl1:Bool = array.writeToFile(arrayPath, atomically: true) // 字典写入 plist 文件 let bl2:Bool = dictionary.writeToFile(dictionaryPath, atomically:true) // 读 Plist 文件 let arrayFromPlist:NSArray? = NSArray(contentsOfFile: arrayPath) let dicFromPList:NSDictionary? = NSDictionary(contentsOfFile: dictionaryPath) 3、Plist 序列化 let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayPropertyList.plist") let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryPropertyList.plist") // 待写入数据 let array:NSArray = ["bei", "jing", "huan", "ying", "nin"] // 待写入数据 let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"] // 序列化,将数据转换成 XML 格式的文件 let arrayData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(array, format: .XMLFormat_v1_0, options: 0) let dictionaryData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(dictionary, format: .XMLFormat_v1_0, options: 0) // 输出到 .txt 格式文件中 let bl1:Bool = arrayData.writeToFile(arrayPath, atomically: true) let bl2:Bool = dictionaryData.writeToFile(dictionaryPath, atomically:true) // 反序列化 let arrayFromeFile:NSArray = NSArray(contentsOfFile: arrayPath)! let dicitionaryFromeFile:NSDictionary = NSDictionary(contentsOfFile: dictionaryPath)! 4、Plist 文件的使用 4.1 Plist 文件的创建 4.2 Plist 文件的解析 // 获得 Plist 文件的全路径 let path = NSBundle.mainBundle.pathForResource(@"shops", ofType:@"plist") // 加载 plist 文件 let shops:NSArray? = NSArray(contentsOfFile: path) 4.3 Plist 文件的解析过程 4.4 Plist 的使用注意 plist 的文件名不能叫做 “info”、“Info” 之类的。 添加 plist 等文件资源的时候,一定要勾选下面的选项。

优秀的个人博客,低调大师

iOS - Swift NSUserDefaults 数据存储

前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。如果往 userDefaults 里存了一个可变数组,取出来的时候这个数组对象就变成了不可变的。 NSUserDefaults 可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefaults 存储。 NSUserDefaults 存储的数据存储在 Library/Preferences 文件夹中 Plist 文件中。 1、NSUserDefaults 的使用 // 创建单例类对象 let userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults() 存放数据 // 存放数据 userDefaults.setObject("I Love China", forKey: "string") // 同步数据,把数据持久化到 standardUserDefaults 数据库 userDefaults.synchronize() 读取数据 // 从 userDefaults 里查询数据 let str:String = userDefaults.objectForKey("string") as! String 删除数据 // 删除数据 userDefaults.removeObjectForKey("string") // 同步数据 userDefaults.synchronize()

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册