《swift2.0 官方教程中文版》 第1章

以下是第1章的学习笔记,全是copy,哈哈


import Foundation


// 打印helloworld

print("Hello,world")


// 使用 let来声明常量,使用 var来声明变量。一个常量的值,在编译的时候,并不需要有明确的值,但是你只能为它赋值一次。也就是说你可以用常量来表示这样一个值:你只需要决定一次,但是需要使用很多次。

var myVariable = 42

myVariable = 50

let myConstant = 42


// 如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。

let implicitInteger = 70

let implicitDouble = 70.0

let explicitDouble: Double = 70


// 练习:创建一个常量,显式指定类型为 Float并指定初始值为4

let a001: Float =4


// 值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。

let label = "The width is"

let width = 94

let widthLabel = label +String(width)


// 有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。例如:

let apples = 3

let oranges = 5

let appleSummary = "I have \(apples) apples."

let fruitSummary = "I have \(apples +oranges) pieces of fruit."

print(appleSummary)

print(fruitSummary)


// 练习:使用 \()来把一个浮点计算转换成字符串,并加上某人的名字,和他打个招呼。

let age = 5.4

print("Jack,\(age)")


// 使用方括号 []来创建数组和字典,并使用下标或者键(key)来访问元素。

var shoppingList = ["","","","","","",""];

shoppingList[1] =""


var person = [

"age" :15,

"name" :"吖吖"

]

person["age"] =17


// 要创建一个空数组或者字典,使用初始化语法。

let emptyArray = [String]()

let emptyDictionary = [String:Float]()


// 如果类型信息可以被推断出来,你可以用 [] [:]来创建空数组和空字典——就像你声明变量或者给函数传参数的时候一样。

shoppingList = []

let occupations = [:]


// 使用 if switch来进行条件操作,使用 for-in for while repeat-while来进行循环。包裹条件和循环变量括号可以省略,但是语句体的大括号是必须的。

let individualScores = [75,43,103,87,12]

var teamScore = 0

for score inindividualScores {

if (score >50) {

teamScore +=3

} else {

teamScore +=1

}

}

print(teamScore)

// if语句中,条件必须是一个布尔表达式——这意味着像 if score { ... }这样的代码将报错,而不会隐形地与 0做对比。


var optionalString:String? ="Hello"

print(optionalString ==nil)


var optionalName: String? ="John Appleseed"

var greeting = "Hello!"

if let name =optionalName {

greeting ="Hello,\(name)"

} else {

greeting ="Hello,nil";

}

print(greeting)


// switch 支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。不能删除default语句,否则报错

// 运行 switch中匹配到的子句之后,程序会退出 switch语句,并不会继续向下运行,所以不需要在每个子句结尾 break

let vegetable = "red pepper"

var vegetableComment = ""

switch vegetable {

case"celery":

vegetableComment ="Add some raisins and make ants on a log."

case"cucumber","watercress":

vegetableComment ="That would make a good tea sandwich."

caselet xwhere x.hasSuffix("pepper"):

vegetableComment ="Is it a spicy\(x)?"

default:

vegetableComment ="Everything tastes good in soup."

}

print(vegetableComment);




//你可以使用 for-in来遍历字典,需要两个变量来表示每个键值对。字典是一个无序的集合,所以他们的键和值以任意顺序迭代结束。

let interestingNumbers = [

"Prime": [2,3,5,7,11,13],

"Fibonacci": [1,1,2,8],

"Square": [1,4,9,16,25],

]

var largest = 0

for (kind,numbers) in interestingNumbers {

for numberin numbers {

largest = number

}

}

print(largest)


//使用 while来重复运行一段代码直到不满足条件。循环条件也可以在结尾,保证能至少循环一次。

var n = 2

while n <100 {

n =n *2

}

print("n =\(n)")


var m = 2

repeat {

m =m *2

} whilem <100

print("m =\(m)")


//你可以在循环中使用 ..<来表示范围,也可以使用传统的写法,两者是等价的:

//使用 ..<创建的范围不包含上界,如果想包含的话需要使用 ...

var firstForLoop = 0;

for i in0..<4 {

firstForLoop += i

}

print("firstForLoop = " +String(firstForLoop))


var secondForLoop = 0

for var i =0; i <4; ++i {

secondForLoop += i

}

print("secondForLoop = " +String(secondForLoop))



//使用 func来声明一个函数,使用名字和参数来调用函数。使用 ->来指定函数返回值的类型。

func greet(name: String,day:String) ->String {

return"Hello\(name),today is\(day)."

}

print(greet("Bob",day:"Tuesday"))


//练习:删除 day参数,添加一个参数来表示今天吃了什么午饭。

func greet(name: String,whatdinner:String) ->String {

return"Hello\(name),today eat\(whatdinner)."

}

print(greet("Bob",whatdinner:"fish"))


func calculateStatistics(scores: [Int]) -> (min:Int,max:Int,sum:Int) {

var min = scores[0]

var max = scores[0]

var sum =0

for scorein scores {

if score > max {

max = score

} elseif score < min {

min = score

}

sum += score

}

return (min,max,sum)

}

let statistics = calculateStatistics([5,100,9])

print("statistics.sum is\(statistics.sum)")

print("statistics.0 is\(statistics.0)")



//函数可以带有可变个数的参数,这些参数在函数内表现为数组的形式:

func sumOf(numbers: Int...) -> Int {

var sum =0

for numberin numbers {

sum += number

}

return sum

}

sumOf()

sumOf(42,597,12)



//练习:写一个计算参数平均值的函数。

func avl(numbers: Int...) ->Int {

var sum =0

for numberin numbers {

sum += number

}

return sum / numbers.count

}

print("平均值是:\(avl(5,9,10))")


//函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。

func returnFifteen() -> Int {

var y =10

func add() {

y += 5

}

add()

return y

}

returnFifteen()


//函数是第一等类型,这意味着函数可以作为另一个函数的返回值。

func makeIncrementer() -> (Int ->Int) {

func addOne(number:Int) ->Int {

return1 + number

}

returnaddOne

}

var increment = makeIncrementer()

increment(7)


//函数也可以当做参数传入另一个函数。

func hasAnyMatches(list: [Int],condition:Int ->Bool) ->Bool {

for itemin list {

if condition(item) {

returntrue

}

}

returnfalse

}

func lessThanTen(number: Int) -> Bool {

return number <10

}

var numbers = [20,19,12]

print(hasAnyMatches(numbers,condition:lessThanTen))



//使用 class和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。

class Shape {

var numberOfSides =0

func simpleDescription() ->String {

return"A shape with\(numberOfSides) sides."

}

let number1 =5

func getANum(number:Int) {

print(number)

}

}


//这个版本的 Shape类缺少了一些重要的东西:一个构造函数来初始化类实例。使用 init来创建一个构造器。

class NamedShape {

var numberOfSides:Int =0

var name:String

init(name:String) {

self.name = name

}

func simpleDescription() ->String {

return"A shape with\(numberOfSides) sides."

}

}



class Square: NamedShape {

var sideLength:Double

init(sideLength:Double,name:String) {

self.sideLength = sideLength

super.init(name: name)

numberOfSides =4

}

func area() ->Double {

returnsideLength *sideLength

}

overridefunc simpleDescription() ->String {

return"A square with sides of length\(sideLength)."

}

}

let test = Square(sideLength:5.2,name:"my test square")

test.area()

test.simpleDescription()



//练习:创建 NamedShape的另一个子类 Circle,构造器接收两个参数,一个是半径一个是名称,在子类 Circle中实现 area() simpleDescription()方法。

class Circle: NamedShape {

var radius:Double

init(radius:Double,name:String) {

self.radius = radius

super.init(name: name)

numberOfSides =0

}

func area() ->Double {

return3.14 *radius *radius

}

overridefunc simpleDescription() ->String {

return"A circle with sides of radius\(radius)."

}

}



//除了储存简单的属性之外,属性可以有 getter setter

class EquilateralTriangle:NamedShape {

var sideLength:Double =0.0

init(sideLength:Double,name:String) {

self.sideLength = sideLength

super.init(name: name)

numberOfSides =3

}

var perimeter:Double {

get {

return3.0 *sideLength

}

set {

sideLength = newValue /3.0

}

}

overridefunc simpleDescription() ->String {

return"An equilateral triagle with sides of length\(sideLength)."

}

}

var triangle = EquilateralTriangle(sideLength:3.1,name:"a triangle")

print("triangle.perimeter is\(triangle.perimeter)")

triangle.perimeter =9.9

print("triangle.sideLength is\(triangle.sideLength)")



//注意 EquilateralTriangle类的构造器执行了三步:

//1. 设置子类声明的属性值

//2. 调用父类的构造器

//3. 改变父类定义的属性值。其他的工作比如调用方法、getterssetters也可以在这个阶段完成。




//使用 enum来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。

enum Rank: Int {

case Ace =1

case Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten

case Jack,Queen,King

func simpleDescription() ->String {

switchself {

case .Ace:return"ace"

case .Jack:return"jack"

case .Queen:return"queen"

case .King:return"king"

default:returnString(self.rawValue)

}

}

}

let ace = Rank.Ace

let aceRawValue = ace.rawValue


//枚举的成员值是实际值,并不是原始值的另一种表达方法。实际上,以防原始值没有意义,你不需要设置。

enum Suit {

case Spades,Hearts,Diamonds,Clubs

func simpleDescription() ->String {

switchself {

case .Spades:return"spades"

case .Hearts:return"hearts"

case .Diamonds:return"diamonds"

case .Clubs:return"clubs"

}

}

}

let hearts = Suit.Hearts

let heartsDescription = hearts.simpleDescription()


//使用 struct来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用。

struct Card {

var rank:Rank

var suit:Suit

func simpleDescription() ->String {

return"The\(rank.simpleDescription()) of\(suit.simpleDescription())"

}

}

let threeOfSpades = Card(rank: .Three,suit: .Spades)

let threeOfSpadesDescription =threeOfSpades.simpleDescription()



//使用 protocol来声明一个协议。

protocol ExampleProtocol {

var simpleDescription:String {get }

mutatingfunc adjust()

}

//类、枚举和结构体都可以实现协议。

class SimpleClass: ExampleProtocol {

var simpleDescription:String ="A very simple class."

var anotherProperty:Int =69105

func adjust() {

simpleDescription +=" Now 100% adjusted."

}

}

var a = SimpleClass()

a.adjust()

let aDescription = a.simpleDescription

print("aDescription is\(aDescription)")


struct SimpleStructure: ExampleProtocol {

var simpleDescription:String ="A simple structure"

mutatingfunc adjust() {

simpleDescription +=" (adjusted)"

}

}

var b = SimpleStructure()

b.adjust()

let bDescription = b.simpleDescription

print("bDescription is\(bDescription)")


//练习:写一个实现这个协议的枚举。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。