初识Swift

/**

* 初始swift


1优点 1>安全,采用数据类型推断机制,现在对象指针使用,自动化管理内存使程序更安全

2>流行具有optianal,泛型和原则等现代语言的特性,OC语言更具有灵动,更接近自然语言

3>强大强大的模式匹配可以写成更加简单,更加直观的代码,

通过变量插值的方式可以更加方便的格式化字符串,也方便用FoudationUIKit

4>交互性使用playground操场技术来体验新技术,分析问题,做所见即所得的界面原型

5>高效 swift的编译器使用高级的代码分析功能来调优开发者代码,0)"> 6>兼容,swiftOC完全兼容,很容易混编


2缺点

1>swift支持的复杂的数据结构比较有限

2>目前可以使用地方库比较少

3>swift OC一样,基于LLVM编译器,使它不可以在androidwindows phone上工作

*/




* 关键字

1>用作声明的关键字

class deinit enum extension func import init let protocal static struct subscript

typealias var

2>用作语句的关键字

break case continue default do else fallthrought if in for return switch where while

3>用作表达式和类型的关键字

as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUCTION__ __LINE__

4>特定上下文中被保留的关键字

associativity didSet get infix inout override mutating none nonmutaing opertor postfix precedence prefix right set unowned unwoned(safe) unwoned(unsafe) weak

willSet

*/


以下参考来源http://www.csdn.net/article/2015-07-27/2825302/1

在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮相。苹果号称Swift有3大特性:

安全(SAFE)现代(MODERN) 强大(POWER)

安全特性
1> 变量和常量的类型安全Swift用关键字let声明常量,关键字var声明变量。
2>在声明时可以指定常量和变量的类型,也可以不指定类型,而是直接赋值。Swift会通过所赋值的类型自动将定义变量的类型。
如果声明时不进行赋值,那么每个类型的变量都有自己的默认值。

例如Double类型的变量,默认值是0。这点与Objective-C、C++和C语言不同,不对变量赋值的话,那么变量的默认值是一个随机数。如果不注意这点,则很容易由此导致Bug的产生。使用Swift语言则可以避免这种情况发生,所以说Swift是类型安全的。


3>另一个安全特性是在流程控制方面。
Swift的语法规定,如果case语句不能覆盖所有可能的情况,则必须加default语句来处理其他情况。否则编译不能通过。
这样可以避免由于程序员疏忽,流程没有被switch-case经过处理,而引起的逻辑错误。
我们可以看到Swift中的安全特性确实有助于新手减少Bug和逻辑错误。

但是类似于“变量声明时就有初始值”的特性在JavaScript,C#等多种现代语言中早已实现了。


功能强大

1>有一个特性中是对字符串操作的简化,在下面的代码中,Swfit可以用\(a)的形式,代替C语言中对字符串format操作。大大简化了代码,增加了程序的可读性。
2>苹果在新版的Safari和WebKit中增加了一个针对JavaScript的新特性。这个特性可以使用${变量}的符号,代替传统的使用“+”对字符串进行拼接的操作。3> 另一个与功能强大相关的特性是对Unicode的支持。

4>For-in语句的增强。

比如在For-in语句中使用0…4表示循环时取[0,4]的闭区间内整数值。
还可以在For-in中使用“元组”遍历Dictionary
另外用“n…m”的形式表示[n,m]闭区间的语法也可以应用在switch-case语句中:
语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
维基百科上除了有语法糖,还有“语法盐”和“语法糖精”2个概念。分别代表特别难用的语法,和看似很好用但实际有害的语法。比如在Swift beta版中,在for-in语句中可以使用“n..m”语法,表示从n开始,循环m次。例如:

但是在正式版中,这种写法被取消了。因为“n..m”和“n…m”这两种写法太相似了,如果都保留就会引起混淆,降低程序的可读性,成为“语法盐”或者“语法糖精”了。

现在评价Swift中的新语法是语法糖还是语法盐还为时尚早,需要时间和市场的检验。

现代特性。

1>首先是闭包 。在下面的代码中,repeat函数可以接受一个闭包类型的task参数。在调用repeat函数时,传入的第二个参数是一个函数体,其中包含了一行打印语句。
那么什么是闭包呢?

闭包有以下3个特点:

  • 匿名函数(方法);
  • 可以被执行;
  • 可以被作为参数传递。

提到闭包,想必很多人都会想到JavaScript。我们就来对比一下JavaScript的闭包和C#中的Lamda表达式:

2>另一个现代的特性是“泛型”。

在Swift中使用泛型很方便,语法和Java、C#、C++也很类似。
不过使用Objective-C的朋友也有福了,在即将发布的XCode7中,Objective-C也支持泛型了。

因此我们大可不必因为泛型而转向Swift。

3>可选(Optional)变量

这是一个很方便的特性。比如一个返回值为int的函数,可以通过返回nil来表示函数出错的情况。而不需要使用NSError,也不需要通过返回某些特殊int值来表示错误,比如“-1”或“-IntMax”。

不过类似的语法在10年前的C# 2.0中就出现了。

以介绍了这么多Swift的特性,那么应该如何评价Swift语言呢?

从客观上讲,Swift中确实包含了“安全、现代、强大”的特性,但是这些特性在其他语言上早就有支持。因此这些特性与其他语言相比(包括Objective-C)并没有绝对优势。对于一个编程语言,除了语言特性之外,还可以从以下3个方面进行比较:

代码效率

又可以分为代码的“书写效率”、“编译效率”和“运行效率”。如果与Objective-C比较,Swift在书写效率上完胜。
在编译效率上,由于Swift没有.h头文件和一些其他特性,因此比Objective-C在理论上要快。
但是从实际工程上来讲,我们内部的一个iOS项目,包含了几千个Objective-C的文件,完全编译一次需要30分钟左右。
对于这种情况来说,显然不能通过迁移到Swift来解决,而是需要重构。如果是小型项目,则编译时间相差就不大了。

对于Swift和Objective-C的运行效率,primateLab进行了一个对比测试。

  1. 在CPU负荷较大的Mandelbrot的测试中,Swift取得了与C++相近的成绩。
  2. 在GEMM测试中(侧重于大数据在有限内存中顺序读取操作),Swift与C++差距变大了。
  3. 在FFT测试中(大数组随机读取),C++取得的成绩是Swift的近10倍。
  4. 因此可以看出,从运行效率上看,Swift不能完全胜任所有的场景。

综上所述:Swift在代码效率的3各方面,虽然有一定优势,但是还不能由此得出“我们应该转向Swift”的结论。

学习成本

Swift虽然属于类C(C-Family)的语言,在保留了大括号,if-else,do-while,swich-case-default 等语法元素之外,也创新了许多新语法。有些语法形式(比如枚举类型)变化较大。学习Swift语法可能比Objective-C容易一些,但是也不会是零门槛的。
此外使用Swift开发应用必须依赖Cocoa框架,对于之前没有接触Cocoa的程序员,这是一块很大的隐性成本。
这里引用JavaEye社区创始人Robin的一句话供大家参考:
对程序员来说,熟悉Swift语法也不过一天时间足够了。关键是要提供高级数据类型,简化Cocoa类库,否则用不用Swift都没区别。

生态环境

生态环境是一个比较抽象的概念。这里我们把生态环境简化为2个问题:

  • 是否有很多开源工程可以借鉴?
  • 有了问题是否能快速找到答案?
  • Swift虽然在“活跃代码库”数量上比较少,但是在“代码库平均分支”数量和“代码库平均关注者”这两个指标上都处于领先地位。由此可以看出,Swift有一群热情非常高的爱好者,尽管爱好者绝对数量可能不多,但是加速的趋势很大。后续的发展是非常值得期待的。
    第二个问题“有了问题是否能快速找到答案?”,我们可以参考一下 Stackflow 网站做的一个调查。其中最流行语言榜单中,与Github一样,JavaScript排名第一。而Swfit却没有入围。
    但是在最受欢迎的语言榜单上,Swift排名第一, 可以看出Swift的热度很高,但是当前成熟度还不够高。我们接下来考察生态环境中另一个因素:框架。
    我们与最流行的JavaScript对比一下。在Google上搜索“JavaScript framework”,可以看到排名靠前的搜索结果是关于JavaScript框架的对比、排名,以及如何选择框架的文章,对于一个具体框架的介绍排名在第五位。而且为大多数人熟知jQuery、Zepto已经不再搜索结果的第一页上了。
    由此我们可以看出JavaScript的创新性、活跃度和生命力都非常高,不愧为最流行的语言. 与之相比,Swift就只能基于一种框架进行开发——Cocoa。
    Swift可以说是与平台强相关的,离开苹果平台,Swift恐怕没有用武之地。最近十几年我们看到微软、诺基亚的起起落落。因此在我们决定是否选择Swift的时候,我们对苹果的前景和信心也是一个重要的考量因素。

    以上我们从语言特性、代码效率、学习成本和生态环境4各方面考察了Swift。

    调试工具。JavaScript作为一个前台语言为什么这么流行?一个重要因素是诸如像Google Chrome和FireFox等工具为JavaScript提供了相当完善、相当优秀的调试工具。

    跨平台开发。我们是否愿意把自己押宝在一个平台上,赌这一个平台的成败。Php和JavaScript是几乎没有平台的概念。但如果做移动端开发的话,显然还是要选择一个平台的。不过最近Facebook推出了一个框架:Reactive Native。虽然还不完善,但我们可以想象一下,如果我们能用JS开发iOS,那我们还会学Swift吗?

    除了开发之外,在实际项目中还有许多工作要做。比如测试,比如对测试结果的分析,对上线后应用运行状况的分析。如果上线后很多用户出现程序闪退,如何知道闪退原因?定位问题?

    在腾讯内部,有一个公用的crash定位模块。每个App都可以使用这个模块。这个模块可以帮助App定位和分析crash的数量、类别、原因等信息。现在这个模块已经对外公布出来了,名为Bugly。腾讯之外的App也可以使用这个模块了。

    答案是肯定的。Swift中融合了许多现代语言中先进的特性。通过学习Swift可以了解现代语言的发展趋势。多掌握一门语言也有助于横向对比,更深刻的了解语言特性的本质,同时也是提高自己的眼界和学习能力的一个高效的手段。

  • 我的项目是否应该迁移到Swift?
  • 这个问题要具体情况具体分析。首先要看团队的能力。如果团队的学习能力很强,则可以考虑使用Swift。但是也不绝对,如果团队经验非常丰富,在iOS上面拥有五年以上的开发历史,那就要慎重一些了,因为这样会增加学习成本。如果团队很年轻,经验也不多则可以考虑使用Swift。

    接下来还要考虑项目的构成。比如包含上千个C语言的文件,那么转换的成本就太高了。而且会严重影响应用的稳定性。如果是全新的项目,就可以考虑使用Swift了。

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
    现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
    前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
    【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
    前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
    因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
    【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
    用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
    采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
    随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
    基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
    数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
    1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
    Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
    音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
    腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
    音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
    C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
    本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
    在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。