mport Foundation

// MARK: - ?和!的区别
// ?代表可选类型,实质上是枚举类型,里面有None和Some两种类型,其实nil相当于OPtional.None,如果非nil相当于OPtional.Some
// !强制解包
//var number : Int?  // 此时解包会崩溃
var number : Int? = 8  // 此时解包不会崩溃

// 如果对没值(nil)的变量进行强制解包的情况下会造成崩溃
var number1 = number!
print(number1)

// 可选绑定,不用强制解包
if var number2 = number {
    print(number2)
}

// !隐式解析可选类型:有值,没值(nil)
// 如果!强行解析没值的变量,也会造成崩溃
//var intNumber : Int!   // 此时解包会崩溃
var intNumber : Int! = 6   // 此时解包不会崩溃
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 / 2
        }
    }
    
    var centerY : Float {
        // 可以不写set方法,只写get方法
        get {
            return y / 2
        }
    }
    
    // 声明方法
    // 声明一个结构体变量方法(相当于OC中的实例方法)
    func frameInfor() {
        print("x : \(x), y : \(y), width : \(width), height : \(height)")
    }
    
    // 声明一个结构体方法(相当于OC中的类方法),使用static修饰
    static func inFor() {
        print("这是结构体方法")
    }
}

// 2.根据结构体去定义一个结构体变量
var frame = Rect(x: 10, y: 10, width: 100, height: 100)

// 3.访问结构体变量中的属性
// 注意:结构体变量的属性类型可以使用let去修饰,只不过访问的时候不能进行修改
frame.x = 20
print(frame.x)

// 4.访问结构体属性
Rect.description = "我是结构体属性"
print(Rect.description)

// 5.访问计算属性
frame.centerX = 200   // 这句话相当于在调用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 : 20)

// 2.访问类中的属性(对象属性)
print(person1.name!)

// 3.访问类属性
Person.introduce = "我是盖聂"
print(Person.introduce)

// 4.访问计算属性
person1.value = 28
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: 12)

// 调用类方法
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: 3)
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: 22)
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 = {
    $0 > $1 ? $0 : $1
}

// 第五种方式
myBlock = {
    (num1, num2) ->Int in
    return num1 > num2 ? num1 : num2
}

var max = myBlock(num1: 66, num2: 88)
print(max)

Swift_2基础的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. Linux最常用命令的小总结

    目录及文件的基本操作: cd  .. 切换到当前目录的上一级目录 cd 切换工作目录至当前用户的家目录 cd - 返回到上一个打开的目录(像遥控器上的切换键,切换到上一个播放的电视频道) ll -h ...

  2. 项目 XXX 的 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”

    项目 XXX 的 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx” 编译新下载的代码出错 修改包管理器的源为 http://www.nuget.org/api/v2/ .重试后成功 ...

  3. Mysql查看版本,端口命令

    有一段时间没有鼓捣TP了,今天又再复习一下.在Model获取数据的时候提示'MySQL server has gone away'错误,一开始以为是TP问题,还查了半天,后来才发现是配置mysql的时 ...

  4. IntelliMVCCode智能MVC架构的代码助手使用方法

    智能代码生成工具,快速帮助开发者提升开发速度,通过工具自动生成MVC架构的大量源代码,节省更多的开发时间. 工具使用的框架:.net4.0,通过工具连接到数据库自动提取数据表或视图中的结构,生成对应的 ...

  5. 注解的方式搭建springmvc步骤

    1.cope   jar包到lib中 2.配置web.xml文件 <servlet> <servlet-name>springmvc</servlet-name> ...

  6. C#,C++修改vs文件模板,添加自定义代码版权版本信息

    简单型的修改类似该路径下的模板文件即可(vs版本或安装路径不同路径可能不同) C#: 模板参数参考https://msdn.microsoft.com/zh-cn/library/eehb4faa.a ...

  7. nodejs require//////////z

    背景 这篇文基本都是反对的,反对的很有道理,不是说我这篇文章的内容错误,因为这篇文章是我在健身房学习node的时候写的,这些知识都很粗糙,后来发现官方的稳定更详细:地址:http://nodejs.o ...

  8. 校内通知-Notifications表增加老师,家长,学生发送范围字段

    老师发送范围:TReceiveRange 家长发送范围:PReceiveRange 学生发送范围:SReceiveRange alter table Notifications add TReceiv ...

  9. timus 1180. Stone Game 解题报告

    1.题目: 1180. Stone Game Time limit: 1.0 secondMemory limit: 64 MB Two Nikifors play a funny game. The ...

  10. Linux_用户级_常用命令(5):rm

    Linux常用命令第5集包含命令:rm 开篇语:懒是人类进步的源动力 本文原创,专为光荣之路公众号所有,欢迎转发,但转发请务必写出处! 一.命令简介 删除一个目录中的一个或多个文件或目录,如果没有使用 ...