import Foundation

 // MARK: - ?和!的区别
// ?代表可选类型,实质上是枚举类型,里面有None和Some两种类型,其实nil相当于OPtional.None,如果非nil相当于OPtional.Some
// !强制解包
//var number : Int? // 此时解包会崩溃
var number : Int? = // 此时解包不会崩溃 // 如果对没值(nil)的变量进行强制解包的情况下会造成崩溃
var number1 = number!
print(number1) // 可选绑定,不用强制解包
if var number2 = number {
print(number2)
} // !隐式解析可选类型:有值,没值(nil)
// 如果!强行解析没值的变量,也会造成崩溃
//var intNumber : Int! // 此时解包会崩溃
var intNumber : Int! = // 此时解包不会崩溃
var intNumber1 = intNumber
print(intNumber1) // 可选绑定
if var intNumber2 = intNumber {
print(intNumber2)
} // MARK: - 结构体
// 1.声明一个结构体
struct Rect {
// 声明结构体变量的属性(存储属性)
var x : Float
var y : Float
var width : Float
var height : Float // 声明结构体属性, 要使用static
static var description : String? // 声明一个计算属性(是用来专门计算结构体变量属性的setter和getter方法的,本身并没有存储功能)
var centerX : Float {
// set方法
set {
x = newValue
}
// get方法(必须要写)
get {
return x /
}
} var centerY : Float {
// 可以不写set方法,只写get方法
get {
return y /
}
} // 声明方法
// 声明一个结构体变量方法(相当于OC中的实例方法)
func frameInfor() {
print("x : \(x), y : \(y), width : \(width), height : \(height)")
} // 声明一个结构体方法(相当于OC中的类方法),使用static修饰
static func inFor() {
print("这是结构体方法")
}
} // 2.根据结构体去定义一个结构体变量
var frame = Rect(x: , y: , width: , height: ) // 3.访问结构体变量中的属性
// 注意:结构体变量的属性类型可以使用let去修饰,只不过访问的时候不能进行修改
frame.x =
print(frame.x) // 4.访问结构体属性
Rect.description = "我是结构体属性"
print(Rect.description) // 5.访问计算属性
frame.centerX = // 这句话相当于在调用centerX的set方法
let value = frame.centerX // 这句话就相当于在调用centerX的get方法
print(value) // 6.调用结构体变量方法
frame.frameInfor() // 7.调用结构体方法
Rect.inFor() // MARK: - 类(class)
class Person {
var name : String?
var age : Int? // 构造初始化方法
init (name : String, age : Int) {
self.name = name
self.age = age
} // 自定义初始化方式(可以只初始化一部分属性)
init (name : String) {
self.name = name
} // 声明类属性
static var introduce : String? // 计算属性
var value : Int {
set(a) {
age = a // 在写计算属性的时候,一定不能出现self.,否则会造成死循环
}
get {
return age!
}
} // 声明一个类方法
// 1.在类方法前边加上static修饰【虽然是一个类方法,但是该方法在子类中不能进行重写】
static func sayHi() {
print(introduce) // 注意:在类方法中只能使用类属性,不能使用对象属性
}
// 2.在类方法前边加上class修饰【它是一个类方法,可以被子类重写】
class func sayHi1() {
print(introduce)
} // 声明一个实例(对象)方法
func sayHi2() {
print("hello, 我是实例方法")
}
} // 1.创建对象(此时应该和OC区分开来,实例对象,:后边跟的是类,要初始化对象一定要写初始化构造的方法)
var person1 : Person = Person(name : "卫庄", age : ) // 2.访问类中的属性(对象属性)
print(person1.name!) // 3.访问类属性
Person.introduce = "我是盖聂"
print(Person.introduce) // 4.访问计算属性
person1.value =
print(person1.value) // 5.访问类方法
Person.sayHi()
Person.sayHi1() // 6.访问实例方法
person1.sayHi2() // MARK: - 定义一个子类Student,继承Person
// 在swift中不支持多继承
class Student : Person {
// 重写父类的方法
// 重写父类中的类方法(class修饰的可以重写,static修饰的不可以重写)
override class func sayHi1() {
print("我是子类Student类,重写了父类的类方法")
} // 重写父类中的实例方法
override func sayHi2() {
print("我是子类Student类,重写了父类的对象方法")
}
} // 初始化student对象
var student : Student = Student(name: "天明", age: ) // 调用类方法
Student.sayHi1() // 调用使用方法
student.sayHi2() // MARK: - 值类型和引用值类型的区别
/*
// 值类型
struct animal {
var name : String?
var age : Int? init(name : String, age : Int) {
self.name = name
self.age = age
}
}
var dog = animal(name: "贝贝", age: 3)
var dog1 = dog // 此时将dog的数据拷贝给dog1
dog.name = "欢欢"
print("dog.name : \(dog.name!), dog1.name : \(dog1.name!)")
*/ // 引用值类型
class animal {
var name : String?
var age : Int? init(name : String, age : Int) {
self.name = name
self.age = age
}
}
var dog = animal(name: "贝贝", age: )
var dog1 = dog
dog.name = "欢欢"
print("dog.name : \(dog.name!), dog1.name : \(dog1.name!)") // MARK: - 协议(protocol)
// 当swift中声明协议的时候,协议里有可选方法需要使用@objc关键字修饰
@objc protocol MarrayDelegate {
func cook() // 做饭
func wash() // 洗衣服
optional func hitDoudou() // 打豆豆
} protocol DivorceDelegate {
func diviseMoney() // 分割财产
} // 如果一个类要遵循协议的时候,如果这个类有父类要在:后先写父类,然后用,隔开,后面跟着协议
class Man: Person, MarrayDelegate, DivorceDelegate {
@objc func cook() {
print("我要做饭了")
} @objc func wash() {
print("我要洗衣服了")
} func diviseMoney() {
print("分财产")
}
} // 创建一个男人
let man = Man(name: "韦小宝", age: )
man.cook()
man.wash()
man.diviseMoney() // MARK: - 扩展(Extension)
// 1.扩展协议中的相关方法
extension Man {
@objc func hitDoudou() {
print("嘿嘿嘿")
}
}
man.hitDoudou() // 2.扩展还可以扩展类方法(类似于OC中的Category)以及对象方法
extension Man {
// 扩展一个对象方法
func sing() {
print("唱一首歌")
} // 扩展一个类方法
class func sleep() {
print("多喝水")
}
} man.sing()
Man.sleep() // MARK: - 闭包
// 求两个数的最大值
/*
在OC中使用Block实现
int (^myBlock)(int num1, int num2) = ^int (int num1, int num2) {
return num1 > num2 ? num1 : num2
}
*/ // 使用闭包
var myBlock : ((num1 : Int, num2 : Int) ->Int) // 第一种使用方式
myBlock = {
(num1 : Int, num2 : Int) ->Int in // 切记不能忘记in
return num1 > num2 ? num1 : num2
} // 第二种方式
myBlock = {
num1, num2 in
return num1 > num2 ? num1 : num2
} // 第三种方式
myBlock = {
num1, num2 in
num1 > num2 ? num1 : num2
} // 第四种方式
myBlock = {
$ > $ ? $ : $
} // 第五种方式
myBlock = {
(num1, num2) ->Int in
return num1 > num2 ? num1 : num2
} var max = myBlock(num1: , num2: )
print(max)

swift基础二的更多相关文章

  1. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  2. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  3. swift基础:第六部分:类与对象

    http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...

  4. swift基础:第二部分:函数和闭包

    今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...

  5. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  6. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  7. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  8. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  9. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

随机推荐

  1. VS2012未找到与约束ContractName...匹配的导出

    用VS2012创建ARCGIS插件项目时,提示“未找到与约束ContractName...匹配的导出”,此前一直都是正常的额 经查,发现是近期系统相关更新导致,解决办法有两种途径: 一是删除近期更新的 ...

  2. CentOS 6.4 快速安装Nginx笔记

    CentOS 6.4 快速安装Nginx笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/9860 ...

  3. Unity3D 敌人AI 和 动画( Animator )系统的实例讲解

    在这个实例中,我们要做一些敌人AI的简单实现,其中自动跟随和动画是重点,我们要达到的目标如下: 1.敌人能够自动跟随主角 2.敌人模型一共有四个动作:Idle(空闲) Run(奔跑) Attack(攻 ...

  4. Oracle 11g 安全加固

    1.安全加固的检查方向 2.安全加固检查safeCheck.sh 3.安全加固执行safeExec.sh 1.安全加固的检查方向 1.1.sysdba用户远程登录限制(查看Oracle登录认证方式) ...

  5. JS魔法堂:浏览器模式和文档模式怎么玩?

    一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过“浏览器模式”和“文档模式”(IE11开始改为“浏览器模式”改成更贴切的“用户代理字符串”)品味一番,它的出现 ...

  6. mysql主从复制显示正常,数据没同步现象。

    当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...

  7. ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...

  8. C#中override和new修饰符的区别

    (new)“隐藏”,(override)“覆盖”(重写).不过要弄清楚这两个有什么区别确实也很难,因为子类在使用父类方法时根本看不出区别,子类不管父类是new了还是override了,用的都是父类方法 ...

  9. Visual Studio《加载此属性页时出错》的解决办法

    打开aspx页面时不能切换到设计视图,vs 2008工具箱中无控件.打开vs 2008的工具>选项>HTML设计器时提示:加载此属性页时出错 有时还会有其它错误提示,比如打开一个Windo ...

  10. 操作AppConfig.xml中AppSettings对应值字符串

    //查询AppSettings的key         public static List sql()         {             List list = new List();   ...