iOS 开发 第一章 类、结构体、mvc、面向协议编程


一、类和结构体
      类是现实生活中的物体的抽象,它可以将一个物体的属性、动作等封装在一个类里面。可以将这个类型继承给它的子类,可以拥有多个子类,但是只能有一个父类。

     结构体的功能和类相似,但是有一个本质的区别那就是类是引用类型,结构体是值类型。引用类型和值类型最大的区别在于传递参数上,值类型在传递时传递的是原类型的拷贝,就是另外建立一个一摸一样的。改变传递的值不会涉及到原类型。而引用类型传递的时候传递的是原类型的引用,实际上传递的和原来的东西是同一个东西。改变其中一个也会改变另外一个。

    而如果我们需要这样一种通过改变传递的值改变原来的值要怎么样呢?可以使用关键字inout。在参数前面使用inout关键字后,当传递的参数发生改变时,这个值会替换掉原来的值,这个参数对于值类型来讲都是适用的。

    结构体还有一个用于函数的关键字mutating。结构体是值类型,所以结构体不能使用内部函数来改变自身的值,但是如果我们需要一个这样的函数那就在函数前面加上mutating关键字。这个就可以改变你自身的值了。

    类和结构体还有一点不一样,那就是构造函数。类必须有一个构造函数存在,如果没有将会报错。而结构体可以不显示的写构造函数,swift语言会给你分配一个构造函数。

    苹果公司推荐在同样的情况下优先考虑使用结构体而不是类。因为类所能实现的几乎所有功能都可以通过结构体+协议+扩展来实现。而且这样做将会有一下优点。

    但是要知道有些时候你只能使用类而不能使用结构体,那就是递归里。这里我优点说不明白应用一下书“Protocol-Oriented Programming with SWIFT“里的代码和图片展示一下
代码如下:
 
  
 
  
struct LinkedListValueType {
    var value: String
    var next: LinkedListValueType?
}

  这段代码在Xcode里将会报错:Value type 'LinkedListValueType' cannot have a stored property that recursively contains it
    提示值类型不能用在递归里。
 
    
  
    而这是为什么呢?上面提到的书里有以下解释:
var one = LinkedListValueType(value: "one", next: nil)
var two = LinkedListValueType(value: "Two", next: nil)
var three = LinkedListValueType(value: "Three", next: nil)
//使用下面的代码把这些节点连接到一块儿:
one.next = two
two.next = three



而这样做会产生什么呢?

就是这个后果,one.next得到的只是原来的two的一个拷贝。后面一行同样的原理。



二、MVC
mvc : 按照我的理解就是把整个软件分成三个部分,model、controller、view。
model:是你数据的部分。
controller:是model和view的桥梁。通过处理model的数据改变view的状态。view也可以通过controller来改变数据的更新。
view:view就是我们在界面上可以看的见的东西了,button、textView、imageView等等都属于view。
下面这张图是我从谷歌拷贝来的,很好的解释了这三个东西之间的关系:
    iOS中model和view是不允许通信的。controller可以没有限制的访问model和view部分,二model和view想和controller联系是需要通过一些函数来进行。

三、面向对象和面向协议

    面向对象的核心是类上面已经讲过,下面对协议说一下我的了解

     协议:就是通过protocol关键字来生声明的一些数据和方法,数据要对读写权限方面进行说明:get set代表可读写,get代表只读。协议可以用在swift中的任何类型。而遵从这个协议的类型必须含有协议里的数据和方法。这也是比继承好的一点。如果是继承的话你很可能会遗忘掉某些父类中的属性,而在遵从某个协议的时候如果缺少数据将会报错。
我再书中看到协议最好是将数据和函数部分分开来写这样比较清晰,可以通过extension(扩展)来对协议进行扩展,其实extension函数可以用于swift中的任何类型。自定义的类型和swift原始类型都可以。
协议中的函数不需要写具体的实现,因为协议不能定义实例,他既不是值类型也不是引用类型。

    面向协议可以弥补面向对象产生几个缺点。
1.面向对象可能产生过度耦合。因为面向对象里的类是引用类型,当一个实例有多个引用的时候改变一个,将会改变其他的。这对于新手来说比较容易出现的错误。而结构体+协议+扩展是值类型,不会出现这样的情况。
2.面向对象的代码更改父类的代码的时候你无法知道它对子类产生什么样的影响。当一个父类有众多子类,子类也有多个层级的时候类的层次和代码将变得非常庞大和复杂。
3.swift中的类的继承只能有一个父类,并且只有类才能使用继承,而协议、扩展是所有类型都可以使用的,并且不限数量,一个类型可以继承多个协议。


猜你喜欢

转载自blog.csdn.net/hacker_letu/article/details/80036637