Swift 了解(1)
Apple取消了oc的指针以及其他不安全的访问的使用,舍弃的smalltalk语法,全面改为点语法,提供了类似java的命名空间 范型 重载;
首先我们了解一下Swift这门语言。Swift就像C语言一样,使用变量来进行存储并通过变量名来关联值。在swift中广泛的使用着不可变的变量,也就是我们常说的常量。但是Swift远远比C语言的常量强大。记住这里说的是比C的常量强大,并不是比C语言强大。这点要理解清楚。在Swift中如果你需要处理的值不需要改变,那使用常量的可以让我们的代码更清晰地表达我们的意图和逻辑。
除了我们熟悉的类型,Swift还增加了Objective-C中没有的高阶数据类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,我们可以用一个元组可以返回多个值
Swift增加了可选(optional)类型,用于处理值缺失的情况。所谓的可选类型,接触过OC的肯定比较清楚一下。可选类型像是Objective-C中使用的nil,但是它可以在任何类型上,不仅仅是类!Swift有了可选类型的存在比OC中的nil指针更加安全也更具表现力。它是Swift许多强大类型的重要组成部分。
常量和变量
常量和变量必须在使用前声明,用let来声明常量,用var来声明变量
例如:
let max = ; var min =;
对象(Objects)
变量也可以表示对象,对象的类型就是类的名字。记住,类就是这个对象的蓝图,类里面包含了对象所有的属性和行为。
下面这行代码,用var
表示这是一个变量,用fastCar
作为变量名,冒号后声明这个变量是对象类型,在这里,就是Car
,最后,用等号表示这个变量的初始值是一个新的车对象:
var fastCar: Car = Car()
字符串中的变量(Variables in Strings)
使用字符串插入(string interpolation),可以直接在变量中增加字符串。字符串插入这个术语是指在一个字符串里使用占位符来产生一个字符串。程序运行后,这些占位符就会直接调用。在这里,字符串是用双引号表示的,那么占位符是用\()
表示的,两个括号中是需要插入的字符串。字符串插入这个方法可以将一个非字符串的变量方便地转换为字符串类型:
let seatsPerRow =
let numberOfRows =
var seatsString = "In the theater, there are \(numberOfRows) rows and \(seatsPerRow) seats in each row." //In the theater, there are 15 rows and 25 seats in each other row.
类型推断(Type Inference)
为每一个变量和常量声明类型可是一件体力活,苹果公司的工程师一直致力于让开发者的工作更轻松。基于你提供的等号右边的值,Swift可以自己判断类型,也就是具有类型推断的能力,这使得声明变量更加容易。请见下面的例子:
var numberOfYears =
let name = "Steve"
let isMale = true
var bankAccountBalance = 1034.20
冒号和冒号后面的类型就不需要了,因为Swift可以根据等号右边的值来推断类型,然后自动设定变量的类型。这样能节省不少时间,也能让代码更简洁。
类型标注:
当我们声明常量或者变量的时候可以加上类型标注,说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
例如:
var welcomeMessage:String
在welcomeMessage中我们可以理解为:”声明一个类型为String,名字为welcomeMessage的变量”
类型为String的意思是可以存储任意String类型的值
welcomeMessage = “Hello”
我们在Swift中可以根据自己喜欢的字符作为常量和变量名,包括Unicode字符!
例如:let $ = 3.3333,let你好=”Hello word!”,let?? =“dogcow”
注意:常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
注意:如果我们需要使用Swift中保留关键字相同的名称作为常量或者变量名,我们可以使用反引号(^)将关键字包围的方式将其作为名字使用,但是无论如何我们都应当避免使用关键字作为常量或变量名。
集合(Collection)
在某些情况下,有必要将许多变量或常量更好地组织在一起,Swift提供2种集合类型来保存和组织这些变量。
数组(Arrays)
数组(Array)是按照聚体顺序存储多个变量的容器。数组可以存储几乎无限的元素(item),同时每个元素都有一个数组下标,准确标明此元素在数组中的位置。可以这样声明一个数组:
var names: [ String ] = [ "Steve", "Jeff", "Andy", "Andrew", "Cole", "Mike", "Mikey" ]
开头还是var
,接着是冒号,然后是方括号,方括号里是数组的类型,等号的右边,用方括号括起来所有的数组元素,里面每个数组元素用逗号分开。
在Swift中,数组中所有的元素必须是同样的类型,这以为着一个数组能存储所有的字符串,如上面的例子,但是不能存储整型和字符串2种不同的类型的元素。数组只能存储同样类型的变量。
对于一个既定的数组,Swift可以自行判断出类型,没有必要专门写出数组的类型,所以上面的数组也可以写成这样:
var names = [ "Steve", "Jeff", "Andy" ]
也可以给你的数组增加一个数组:
var names = [ "Steve", "Jeff", "Andy", "Wally" ]
var parents = [ "Mike", "Adam", "Nick" ]
names = names + parents // [ "Steve", "Jeff", "Andy", "Wally", "Mike", "Adam", "Nick" ]
词典(Dictionaries)
数组不是唯一的集合类型,词典也可以存储多个变量,用键(Key)和值(value)将多个变量组织在一起。键值的工作原理和你书架上的牛津大词典类似,键(Key)是你要查找的单词,而值(value)是这个单词的释义。词典是无序存储的,所以只能使用键(key)来获取某个值(value),例如:
var homeruns : [ String : Int ] = [ "Posey" : , "Pagan" : , "Pence" : ]
在这个例子中,有三个键(keys):"Posey"
, "Pagan"
, "Pence"
,每个键都有对应的值。提高相关的键,写在中括号中,就能获取相对应的值:
homeruns[ "Posey" ] //
增加一对键值:
var homeruns : [ String : Int ] = [ "Posey" : , "Pagan" : , "Pence" : ]
homeruns[ "Sandoval" ] = // [ "Posey" : 24, "Pagan" : 19, "Pence" : 15, "Sandoval" : 10 ]
将键对应的值设置为空(nil),就可以删除这对键值。nil是空值,我们将在章节结束的时候更深入的介绍nil。删除键值方法:
homeruns [ "Sandoval" ] = nil // [ "Posey" : 36, "Pagan" : 19, "Pence" : 15 ]
输出常量和变量
在Swift中print(_:separator: terminator:)函数来输出当前常量或变量的值:
注:这也是区别OC语言之处
Swift用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
print("The current value of friendlyWelcome is \(friendlyWelcome)") //输出"The current value of friendlyWelcome is Bonjour!
分号的使用
与其他大部分编程语言不同,Swift并不强制要求我们在每条语句的结尾处使用分号(;),当然,你也可以按照 你自己的习惯添加分号。有一种情况下必须要用分号,即我们打算在同一行内写多条独立的语句:
let cat ="?"; print(cat) //输出"?"
类型别名
布尔值
Swift有一个基本的布尔类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift有两个布尔常量,true和false:
let orangesAreOrange = true let turnipsAreDelicious = false
在我们编写条件语句,比如说if语句的时候,布尔值非常的好用
if turnipsAreDelicious { print("Mmm,tasty turnips!") } else { print("Eww,turnips are horrible.") }//输出"Eww, turnips are horrible."
元组
元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型
let http404Error = (, "Not Found")
我们可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型
let (statusCode,statusMessage) = http404Error print("The status code is \(statusCode)")//输出"The status code is 404" print("The status message is \(statusMessage)") //输出"The status message is Not Found"
Swift 了解(1)的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
随机推荐
- python字符串实战
haproxy配置文件 思路:读一行,写一行 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defa ...
- bzoj1834 [ZJOI2010]网络扩容
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...
- MySQL注射的过滤绕过技巧
SQL注射的绕过技巧较多,此文仅做一些简单的总结. 最好利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可能需要暴力猜解 ...
- 【外文翻译】使用Timer类去调度任务 ——java
使用Timer类去调度任务 --java 原文地址:https://dzone.com/articles/using-timer-class-to-schedule-tasks 原文作者:Jay Sr ...
- string 学习
#include <string> 1.取当中某个字符 与传统一样 c[11]="0123456789"; c[1]=1; ps:好慢 .. 会不会GG... #inc ...
- 窝上课不听,how to learn C language easily(1)
C language 学习心得 附:为啥起这么霸气侧漏,招大神们鄙视的标题,正如我在<C language>随笔的介绍中写的,这是一个写个妹纸们看的C language的文章.没错!!写这 ...
- (原创)如何在性能测试中自动生成并获取Oracle AWR报告
版权声明:本文为原创文章,转载请先联系并标明出处 由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意. 过去我们执行测试,都是执行开始和结束分别手动建立一个快照, ...
- [大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<2>
前言:上篇[大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<1>中介绍了ES ,Kibana的单机到分布式的安装,这里主要是介绍Elast ...
- 跨交换机相同vlan内的通信(trunk模式)
当一个公司的小型局域网内部,处于不同楼层的主机处在同一个虚拟局域网内,连接到不同的交换机上,这时候就需要相同虚拟局域网内部的主机进行跨交换机进行通信. 通过设置交换机之间相连接的端口开启trunk模式 ...
- photo
我们在android开发过程中 经常有做到发图片或修改上传头像的功能 即要调用系统相册 如何调用系统相册并处理返回的数据呢?因为随着android手机系统的提高 不同系统的手机对调用相册并处理相册不同 ...