swift swift怎么导入头文件实文件读写

Swift 如何实现手势识别 - 技术翻译 - 开源中国社区
当前访客身份:游客 [
已有文章 2386 篇
当前位置:
Swift 如何实现手势识别
英文原文:
0人收藏此文章,
推荐于 2年前 (共 6 段, 翻译完成于 07-27) ()
参与翻译(1人):
在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。
让我们开始吧!
首先需要在Xcode中创建一个新的Single View Application:
然后点击Next,弹出的窗口要求你填写项目设置。在第一栏 (“Product name”) 中填入项目名称后,点击Next.
确保语言选择的是 “Swift”.
&翻译的不错哦!
点击 “Main.storyboard” 文件,拖出6个 UIViews放到视图中.把视图排列成如图所示的样子.当你排列UIViews时,在每个view下面添加一个UILabel并依图设定文本值。
我们开始写代码吧.
是时候编辑实现文件了 (在我们的案例 “ViewController.swift” ).
为了声明一些我们将会用到的变量,要在 “class ViewController: UIViewController “块中添加如下代码.
class&ViewController:&UIViewController&{
&&&&@IBOutlet&var&tapView:&UIView
&&&&@IBOutlet&var&swipeView:&UIView
&&&&@IBOutlet&var&longPressView:&UIView
&&&&@IBOutlet&var&pinchView:&UIView
&&&&@IBOutlet&var&rotateView:&UIView
&&&&@IBOutlet&var&panView:&UIView
&&&&var&lastRotation&=&CGFloat()
&&&&let&tapRec&=&UITapGestureRecognizer()
&&&&let&pinchRec&=&UIPinchGestureRecognizer()
&&&&let&swipeRec&=&UISwipeGestureRecognizer()
&&&&let&longPressRec&=&UILongPressGestureRecognizer()
&&&&let&rotateRec&=&UIRotationGestureRecognizer()
&&&&let&panRec&=&UIPanGestureRecognizer()
在第2 – 7行,我们声明了在之前界面里排列过的 UIViews.
在第8行,我们声明了实现旋转手势要用到的变量(lastRotation).
在第 9 – 14行,我们为每个view声明了一个手势识别对象.
注意:&在 Swift中,我们用let关键字声明常量,这意味着它的值在程序运行时不可改变。关键字var则声明普通变量。
&翻译的不错哦!
当声明完应用需要的主要变量后,在viewDidLoad&方法中添加如下代码.
override&func&viewDidLoad()&{
&&&&super.viewDidLoad()
&&&&tapRec.addTarget(self,&action:&"tappedView")
&&&&pinchRec.addTarget(self,&action:&"pinchedView:")
&&&&swipeRec.addTarget(self,&action:&"swipedView")
&&&&longPressRec.addTarget(self,&action:&"longPressedView")
&&&&rotateRec.addTarget(self,&action:&"rotatedView:")
&&&&panRec.addTarget(self,&action:&"draggedView:")
&&&&tapView.addGestureRecognizer(tapRec)
&&&&swipeView.addGestureRecognizer(swipeRec)
&&&&pinchView.addGestureRecognizer(pinchRec)
&&&&longPressView.addGestureRecognizer(longPressRec)
&&&&rotateView.addGestureRecognizer(rotateRec)
&&&&panView.addGestureRecognizer(panRec)
&&&&rotateView.userInteractionEnabled&=&true
&&&&rotateView.multipleTouchEnabled&=&true
&&&&pinchView.userInteractionEnabled&=&true
&&&&pinchView.multipleTouchEnabled&=&true
&&&&tapView.userInteractionEnabled&=&true
&&&&swipeView.userInteractionEnabled&=&true
&&&&longPressView.userInteractionEnabled&=&true
&&&&panView.userInteractionEnabled&=&true
第 3 – 8行,为每个视图设定手势识别的目标。所谓的目标,就是每个view中的手势完成后要调用的方法。
第 9 -14行,把手势识别添加到视图中.
第15 – 22行,把每个视图的&userInteractionEnabled 属性设为ture,并把拥有需要多点触控(rotateView&and&pinchView)的手势所在的视图的multipleTouchEnabled 属性设为true.
现在,我们编写每个手势识别器要调用的方法 (第3 – 8行设置的目标方法 ).
添加如下代码:
func&tappedView(){
&&&&let&tapAlert&=&UIAlertController(title:&"Tapped",&message:&"You&just&tapped&the&tap&view",&preferredStyle:&UIAlertControllerStyle.Alert)
&&&&tapAlert.addAction(UIAlertAction(title:&"OK",&style:&.Destructive,&handler:&nil))
&&&&self.presentViewController(tapAlert,&animated:&true,&completion:&nil)
func&swipedView(){
&&&&let&tapAlert&=&UIAlertController(title:&"Swiped",&message:&"You&just&swiped&the&swipe&view",&preferredStyle:&UIAlertControllerStyle.Alert)
&&&&tapAlert.addAction(UIAlertAction(title:&"OK",&style:&.Destructive,&handler:&nil))
&&&&self.presentViewController(tapAlert,&animated:&true,&completion:&nil)
func&longPressedView(){
&&&&let&tapAlert&=&UIAlertController(title:&"Long&Pressed",&message:&"You&just&long&pressed&the&long&press&view",&preferredStyle:&UIAlertControllerStyle.Alert)
&&&&tapAlert.addAction(UIAlertAction(title:&"OK",&style:&.Destructive,&handler:&nil))
&&&&self.presentViewController(tapAlert,&animated:&true,&completion:&nil)
这三种方法都很好地完成同一件事.每次在手势在相应的视图中完成后,每种方法都弹出一个对话框.
&翻译的不错哦!
所以&tappedView() 方法在用户滑动视图时弹出一个对话框,swipedView()&方法在用户触摸滑动 swipe视图时弹出对话框,而longPressedView()&方法则在用户长按long press view时弹出对话框.
另两种手势 (rotate and pinch ) 的代码稍微有点复杂.
为旋转手势添加如下代码:
func&rotatedView(sender:UIRotationGestureRecognizer){
&&&&var&lastRotation&=&CGFloat()
&&&&self.view.bringSubviewToFront(rotateView)
&&&&if(sender.state&==&UIGestureRecognizerState.Ended){
&&&&lastRotation&=&0.0;
&&&&rotation&=&0.0&-&(lastRotation&-&sender.rotation)
&&&&var&point&=&rotateRec.locationInView(rotateView)
&&&&var&currentTrans&=&sender.view.transform
&&&&var&newTrans&=&CGAffineTransformRotate(currentTrans,&rotation)
&&&&sender.view.transform&=&newTrans
&&&&lastRotation&=&sender.rotation
这个方法包含&sender:UIRotationGestureRecognizer 参数. sender 参数(&UIRotationGestureRecognizer&类型) 含有这个方法(在这个案例中是rotateRec)调用的手势识别器的值.
第2行声明了&lastRotation.
第3行我们把&rotateView放到前面.
&翻译的不错哦!
接下来,在 if语句中,我们检查手势是否完成,如果没有完成,我们就将视图旋转。
第 8 – 10行,我们计算rotate view的旋转程度,第10行,我们设置rotate view的旋转程度。
On line 12 we set the lastRotation&作为旋转手势识别器的当前旋转.
现在我们添加pinch 手势的代码:
func&pinchedView(sender:UIPinchGestureRecognizer){
&&&&self.view.bringSubviewToFront(pinchView)
&&&&sender.view.transform&=&CGAffineTransformScale(sender.view.transform,&sender.scale,&sender.scale)
&&&&sender.scale&=&1.0
在之前方法的第1行中,我们把pinch视图放到了顶端。然后设置每个pinch视图的transform,并把pinchRec的scale设为1.
然后是实现 pan (drag) 手势.&添加如下代码:
func&draggedView(sender:UIPanGestureRecognizer){
&&&&self.view.bringSubviewToFront(sender.view)
&&&&var&translation&=&sender.translationInView(self.view)
&&&&sender.view.center&=&CGPointMake(sender.view.center.x&+&translation.x,&sender.view.center.y&+&translation.y)
&&&&sender.setTranslation(CGPointZero,&inView:&self.view)
第2行,我们把 drag视图放到顶端 (和前面的方法一样).
然后我们声明变量translation,并用 sender.translationInView(self.view)的值给它赋值。 完成后,把sender.view object (panRec)&的center属性设为计算出来的新center &( 通过CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y)&计算) 并把translation 设为 sender (panRec).
现在,代码部分算是完成了!
&翻译的不错哦!
回到界面设计.
现在我们回到 “Main.storyboard” 文件. 选择视图控制器并把声明的每个UIView连接到相应的视图,如下图所示.
现在你可以在模拟器或你的设备上运行该应用并测试手势。
我希望这篇教程对你有所帮助。你可以在下载完整,另外如果有什么问题,可以通过&&联系我.
最后,请在上试用我的IOS应用.
&翻译的不错哦!
收藏了,最近在各种学习swift比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
SwiftStack“先选取文件再匹配对象API的作法”
关键字:SwiftStack
  Joe Arnold谈以太网接入对象驱动器及其它议题。
  OpenStack能否吸引力到Kinetic的关注与支持?
  以OpenStack为关注重点的开源对象初创SwiftStack公司已经率先引入了希捷的对象存储Kinetic磁盘驱动器--这类驱动器需要驻留软件来管理其I/O操作。
  我们通过一封电子邮件与SwiftStack公司创始人、总裁兼首席产品官Joe Arnold取得了联系,并与之探讨了一系列议题。
  根据Joe的说法,用户在使用Kinetic驱动器时,实际感受与使用普通磁盘驱动器几乎别无二致。下面来看他对此做出的解释:
  记者 我想了解的是,SwiftStack用户是如何使用Kinetic磁盘驱动器(及其它直连键:值磁盘驱动器)的。
  Joe Arnold 对于SwiftStack对象存储用户来讲,使用标准磁盘驱动器或者Kinetic驱动器在具体体验方面几乎没有区别。SwiftStack是第一家由希捷公司指定,有资格在Kinetic API于2013年10月正式发布之前利用其对向外扩展存储集群中的Kinetic驱动器进行管理的软件厂商。
  我们刚刚参加了基金会组织的Kinetic PlugFest会议。SwiftStack公司是少数几家使用由希捷、以及西部数据所提供的Kinetic API的软件厂商。因此就目前而言,该设备的兼容性一切正常,并将在下个阶段提供完整的解决。为此,希捷与SwiftStack之间也在积极推进相关的商业发展机遇。
  记者 SwiftStack是否会通过文件系统对原始(即非Kinetic)磁盘驱动器进行寻址或者访问?如果是这样,那么通过SwiftStack实现的Kinetic驱动器访问在速度方面是否高于标准磁盘驱动器访问?
  Joe Arnold SwiftStack能够接纳原始块存储设备(即磁盘驱动器)并将其资源池创建为一套。各Kinetic驱动器分别能够响应多种来自Swift的API命令,在这方面的运作方式同SwiftStack节点与非Kinetic磁盘驱动器配合时完全一致。
  记者如此说来,SwiftStack用户为什么要选择Kinetic驱动器而非标准磁盘驱动器呢?
  Joe Arnold SwiftStack公司认为用户应当拥有自由选择权。这种选择空间包括服务器、驱动器甚至是具体的驱动器技术。事实上,我们对SwiftStack架构设计进行了构思,从而保证Kinetic与标准驱动器能够在同样的集群与命名空间当中正常使用。这一点非常重要,因为这意味着用户能够更为轻松地逐步实现这项新兴技术。
  我之前曾经就Kinetic技术如何让新型存储拓扑结构成为现实这一议题发表过文章。着眼于短期范畴,其能够更轻松地将必要计算与网络资源加以结合,从而容纳存储工作负载。相较于运行在采用普通磁盘驱动器的标准服务器设备,Kinetic驱动器可以通过机柜中的嵌入式直接与网络相对接--这意味着负责运行存储服务的服务器的自身体积能够得到进一步缩小。
  记者 那么您是如何看待最新兴起的一种观点,即对象存储是一种功能特性而非产品?
  Joe Arnold 如果先选取一套文件系统再为其匹配对象API,那么这套架构无疑属于本末倒置!
  配合一套统一化命名空间的对象存储能够作为文件系统访问的基础,但文件系统则并非反过来扮演对象存储的前提性角色; 文件系统并不能无限度地扩展。这让我想起一句俗话--我们没办法把香肠再变回猪肉。
  诚然,对象可以立足于一套文件系统之上以提供对象API。然而该API本身并不是重点。对象存储是一套架构,而非单纯的访问方法。这套架构能够在一套统一化命名空间之内实现高吞吐率向外扩展的高容量工作负载,同时对元数据加以利用。通过这种方式,由CIFS或者实现的传统文件访问机制将成为统一命名空间内向外扩展存储体系的一种访问功能。
  2015年当中,我们已经亲眼见证了大量备份相关的传统应用开始迎来重构,旨在支持对象API(例如Veritas NetBackup 7.7)以对接统一化命名空间之下的公有以及可扩展型内部存储机制。与我们一样,其它对象存储供应商也在以功能方案的形式交付文件系统访问能力,但总体来讲整个行业并没能找到一种更加确切的分类名称来描述"对象存储"。
  记者 那么Amazon S3与文件层级访问是否进一步推动了对象存储在开源道路上的发展?
  Joe Arnold 应用程序工作负载确实推动了发展态势。如果没有这类需求作为依托,对象存储技术根本不会存在--应用程序将继续使用传统文件存储机制!文件层级访问面向的是过去与当下的应用程序,而对象API访问则面向当下与未来的应用程序。
  OpenStack贡献者数量正在逐年增长
  是的,在Amazon推出其S3存储服务之后,相关消费规模也开始快速增长。另外,也有众多应用程序完全以S3支持为前提进行构建。在SwiftStack起步之初,我们的一些"Web"客户希望将其作为S3的后备方案(具体包括eBay/以及等等),但同时又希望实现其它对象存储解决方案所无法达成的、在标准硬件上实现内部存储资源按需扩展的效果。
  现在我们正在着手其它行业对于消费易行性、按需规模扩展以及公有云规模资源供给等方面的需求。一部分应用程序无法将其全部数据迁移至公有云环境当中,具体包括媒体与娱乐、医疗卫生、生命科学、政府事务以及金融服务等等。在这些行业当中,文件系统访问一直扮演着重要角色。其中一部分新型工作负载已经开始使用对象存储机制,但其仍然需要同当初面向文件系统API所设计的现有应用进行互操作。
  (顺带一提,SwiftStack对S3 API极为推崇。SwiftStack拥有非常完备的兼容性,且能够同Veritas NetBackup、CommVault Software以及Avere等应用程序通过S3 API实现对接。)
  记者 与Caringo、Cleversafe()、Cloudian、(Atmos与ECS)、HGST(Amplidata)、HDS、NetApp(StorageGRID)、Scality以及其它专有对象存储产品相比,开源对象存储方案恐怕仍然处于弱势地位。那么这种状况要如何得到扭转?
  Joe Arnold 千万不要把发展过程同市场实现混为一谈。作为我们所参与的开源社区,Swift拥有庞大的规模、具备数百家活跃开发参与厂商且这一数量仍在不断增加。这意味着任何一款专有对象存储产品的开发团队规模都无法与之相匹敌(除非各专有厂商进行协作),因此从这个角度来看,任何一款专有产品都不能同开源对象存储方案相抗衡。
  各供应商在OpenStack社区中的参与比例
  为什么选择开源?因为各专有竞争厂商的方案"并不成熟",而开源、、应用框架以及如今已经成为企业与Web基础设施当中的实际标准。事实上,开源模式已经非常完整,且能够从本质上将基础设施层转化为--而这一点是大多数专有基础设施平台技术所无法实现的。
  分析人士也认为,AWS S3正是对象的实质性标准API,而OpenStack Swift API则是相关治理工作中的开放标准。以上提到的各款产品都舍弃了自己的专有API,转而使用开发人员及独立软件供应商所支持或者倾向于使用的API。其中很多甚至在产品当中添加了对Swift API的支持能力。从这个角度出发,整个市场态势已经发生了转变。
  总结陈词
  就目前来看,像SwiftStack这样的初创企业确实有机会率先采用新型磁盘驱动器技术方案,而且随着使用过程的不断推进,SwiftStack也将迎来令人鼓舞的发展高潮。
  各以太网接入型磁盘驱动器供应商也将受到OpenStack相关发展成果的推动。而且在我们看来,企业用户将乐于将自己的数据保存在SwiftStack数据存储系统当中,包括软件、服务器、机柜乃至磁盘驱动器,并确保各组件拥有优于传统存储阵列系统的运行状态及成本水平。
  也许像希捷与西部数据这样的巨头级磁盘驱动器与存储阵列厂商能够将上述目标转化为现实。
相关文章:
[ 责任编辑:杨瑗嘉 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注ChinabyteFileKit是一个Swift框架,可以用来简单而直观地进行文件管理。
OS X 10.9+ / iOS 8.0+ / watchOS 2.0 / tvOS 9.0
Xcode 7.1+, Swift 2.1+
使用CocoaPods安装
是一个Objective-C和Swift的集中依赖管理器。点击了解更多
1.将项目添加进你的
use_frameworks!
pod 'FileKit', '~& 3.0.0'
use_frameworks!&pod 'FileKit', '~& 3.0.0'
2.运行pod install 然后打开.xcworkspace文件开启Xcode
3.导入FileKit框架
import FileKit
import FileKit
使用Carthage安装
是一个Objective-C和Swift的分布式依赖管理器。
1.将项目加入
github "nvzqz/FileKit"
github "nvzqz/FileKit"
2.运行carthage update 然后遵照来将FileKit加入你的项目中
3.导入FileKit框架
import FileKit
import FileKit
路径都通过Path结构体进行操作
let home = Path("~")
let drive: Path = "/Volumes/Macintosh HD"
Path = "~/Desktop/file\(1)"
let home = Path("~")let drive: Path = "/Volumes/Macintosh HD"let file:&&Path = "~/Desktop/file\(1)"
创建新文件
调用Path中的createFile()方法就可以创建一个空白文件
try Path(".gitignore").createFile()
try Path(".gitignore").createFile()
创新新目录
通过调用Path中的createDirectory()方法来创建一个目录
try Path("~/Files").createDirectory()
try Path("~/Books").createDirectory(withIntermediateDirectories: false)
try Path("~/Files").createDirectory()try Path("~/Books").createDirectory(withIntermediateDirectories: false)
默认创建的是中间目录
创新新的符号链接
通过调用Path的createSymlinkToPath(_:)来创建符号链接
try Path("path/to/MyApp.app").createSymlinkToPath("~/Applications")
print(Path("~/Applications/MyApp.app").exists)
try Path("path/to/MyApp.app").createSymlinkToPath("~/Applications")print(Path("~/Applications/MyApp.app").exists)&&// true
你可以通过以下代码查找到扩展名为“.txt”,到桌面有5个文件夹深的所有文件的路径
let textFiles = Path.UserDesktop.find(searchDepth: 5) { path in
path.pathExtension == "txt"
let textFiles = Path.UserDesktop.find(searchDepth: 5) { path in&&&&path.pathExtension == "txt"}
searchDepth为负值情况下会返回self中所有扩展名为“.txt”的路径
还可以构建一个函数来表示要查找的文件路径,然后得到非空的结果
let documents = Path.UserDocuments.find(searchDepth: 1) { path in
String(path)
let documents = Path.UserDocuments.find(searchDepth: 1) { path in&&&&String(path)}
通过路径进行迭代
Path遵循SequenceType,它可以通过for循环来进行迭代
for download in Path.UserDownloads {
print("Downloaded file: \(download)")
for download in Path.UserDownloads {&&&&print("Downloaded file: \(download)")}
当前工作的目录
可以通过Path.Current来修改项目当前工作的目录
下面是通过changeDirectory来快速改变当前工作的目录并返回
Path.UserDesktop.changeDirectory {
print(Path.Current)
// "/Users/nvzqz/Desktop"
Path.UserDesktop.changeDirectory {&&&&print(Path.Current)&&// "/Users/nvzqz/Desktop"}
共同的根目录
可以通过以下方法返回两个路径共同的根目录
print(monAncestor(.UserHome))
print("~/Desktop"
&^& "~/Downloads")
print(.UserLibrary &^& .UserApplicationSupport)
// "/Users/nvzqz/Library"
print(Path.Root.commonAncestor(.UserHome))&&&&&& // "/"print("~/Desktop"&&&^& "~/Downloads")&&&&&&&&&&&&// "~"print(.UserLibrary &^& .UserApplicationSupport)&&// "/Users/nvzqz/Library"
将两个路径拼合并返回结果
// ~/Documents/My Essay.docx
let essay = Path.UserDocuments + "My Essay.docx"
// ~/Documents/My Essay.docxlet essay = Path.UserDocuments + "My Essay.docx"
还可以用来拼合字符串和路径,预先将字符串设置为path类型
let numberedFile: Path = "path/to/dir" + String(10)
// "path/to/dir/10"
let numberedFile: Path = "path/to/dir" + String(10)&&// "path/to/dir/10"
将右侧的路径加在左侧路径之后,直接使用字符串类型也可以
var photos = Path.UserPictures + "My Photos"
// ~/Pictures/My Photos
photos += "../My Other Photos"
// ~/Pictures/My Photos/../My Other Photos
var photos = Path.UserPictures + "My Photos"&&// ~/Pictures/My Photosphotos += "../My Other Photos"&&&&&&&&&&&&&&&&// ~/Pictures/My Photos/../My Other Photos
返回路径格式化版本
let path: Path = "~/Desktop"
path% == path.standardized
let path: Path = "~/Desktop"path% == path.standardized&&// true
返回路径的符号链接解析版本
let path: Path = "~/Documents"
path* == path.resolved
let path: Path = "~/Documents"path* == path.resolved&&// true
返回路径的上一级地址
let path: Path = "~/Movies"
path^ == "~"
let path: Path = "~/Movies"path^ == "~"&&// true
将左边地址的文件移到右边
Path中的方法:
moveFileToPath(_:)
moveFileToPath(_:)
File中的方法:
moveToPath(_:)
moveToPath(_:)
-&! 运算符
强制将左边地址的文件移到右边的地址,在移动前删除左边地址的所有内容
将左边的文件拷贝到右边地址
Path中的方法:
copyFileToPath(_:)
copyFileToPath(_:)
File中的方法:
copyToPath(_:)
copyToPath(_:)
强制将左边路径的文件复制给右边路径,在复制前删除左边地址的所有内容
将右边地址设置为左边地址的符号链接
Path中的方法:
symlinkFileToPath(_:)
symlinkFileToPath(_:)
File中的方法:
symlinkToPath(_:)
symlinkToPath(_:)
强制将右边地址设置为左边地址的符号链接,在创建符号链接前删除左边路径下的所有内容
取Path得下标返回的是其组件中直到并包含该索引的内容
let users = Path("/Users/me/Desktop")[1]
let users = Path("/Users/me/Desktop")[1]&&// /Users
standardize()
标准化路径
操作如下:
somePath = somePath.standardized
somePath = somePath.standardized
解析路径的符号链接
操作如下:
somePath = somePath.resolved
somePath = somePath.resolved
可以通过File,并指定其数据类型来创新一个新文件
let plistFile = File&NSDictionary&(path: Path.UserDesktop + "sample.plist")
let plistFile = File&NSDictionary&(path: Path.UserDesktop + "sample.plist")
文件之间可以比较大小
在左边的数据的写入右边的文件中
try "My name is Bob." |& TextFile(path: Path.UserDesktop + "name.txt")
print("I can't write to a desktop file?!")
do {&&&&try "My name is Bob." |& TextFile(path: Path.UserDesktop + "name.txt")} catch {&&&&print("I can't write to a desktop file?!")}
TextFile类可以用来在读写文件中的字符串
TextFile是File&String&的子类,提供一些File&String&没实现的功能
将左侧的字符串添加进右边的TextFile文件中
let readme = TextFile(path: "README.txt")
try "My Awesome Project" |& readme
try "This is an awesome project." |&& readme
let readme = TextFile(path: "README.txt")try "My Awesome Project" |& readmetry "This is an awesome project." |&& readme
DictionaryFile
File&NSDictionary&的typealias
File&NSArray&的typealias
File&NSData&的typealias
FilePermissions结构体可以用来查看指定文件的当前过程的权限
let swift: Path = "/usr/bin/swift"
print(swift.filePermissions)
// FilePermissions[Read, Execute]
let swift: Path = "/usr/bin/swift"print(swift.filePermissions)&&// FilePermissions[Read, Execute]
所有遵循DataType的数据类型可用于通用类型的File。
Readable 协议
Readable类型必须实现readFromPath(_:)方法
所有的readable类型可以通过init(contentsofPath:)初始化
Writeable 协议
Writable类型必须实现writeToPath(_:atomically:)
用过writeToPath(_:)写入的默认自动完成
WriteToFile
WritableToFile协议中这个类型有个writeToFile(_:atomically:)方法,可以传入表示文件地址的字符串作为参数。
WritableConvertible
如果类型本身不能写入文件,但是可以输出一个可写类型,那么这个类型遵循WritableConvertible协议,并通过这种方式成为一个Writable类型
FileKitError
FileKit中抛出的错误封装在FileKitError类中
错误可以通过日志直接转为String格式。只要错误信息需要,FileKitError中有一个message属性记录了错误为什么发生。
// FileKitError(Could not copy file from "path/to/file" to "path/to/destination")
String(FileKitError.CopyFileFail(from: "path/to/file", to: "path/to/destination"))
// FileKitError(Could not copy file from "path/to/file" to "path/to/destination")String(FileKitError.CopyFileFail(from: "path/to/file", to: "path/to/destination"))
FileKit 遵循 MIT 开源许可证发布
资源整理者简介:
可能感兴趣的文章
按分类快速查找
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1363 项工具资源。
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2016 伯乐在线

我要回帖

更多关于 swift plist读写 的文章

 

随机推荐