6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的
/** protocol*/
protocol FullNamed {
/** 计算属性申明,只读的计算属性*/
var fullName:String { get }
}
/** 实现协议*/
struct Person:FullNamed {
/** 实现协议 可以把计算属性实现为存储属性,更改其本身的性质*/
var fullName: String = "abc"
}
/** 开发中的协议*/
protocol MyPotocol {
//计算属性的get set声明
var prop:Int {
get
set
}
var onlyRead:Int{ get }
//实例方法
func instanceMethod()->Int
//静态方法或者类方法
static func typeMethod()
}
class MyClass: MyPotocol {
var prop:Int = 10
var onlyRead:Int = 10
func instanceMethod() -> Int {
return 10
}
//此处按规范应该写static
class func typeMethod() {
print("class method")
}
}
var mc = MyClass()
mc.prop = 3
MyClass.typeMethod()
mc.instanceMethod()
mc.onlyRead = 5
mc.onlyRead
protocol SomeProtocol {
init(a: Int)
func test() -> Int
}
class parent {
init(a:Int){}
}
/** Swift中的协议的所有方法都必须实现,此处MyClass需要实现协议就需要对父类的方法进行改写,所以同时改写方法和实现required协议,前面使用 override 和 required关键字组合搭配:*/
class MyClass1: parent,SomeProtocol {
override required init(a:Int) {
super.init(a: 100) //改写内部实现方法依然为父类的方法。
}
func test()->Int {
return 1
}
}
//使用OC中的协议方式
@objc protocol ObjecProtocol {
func requiredMethod()
optional func optionalMethod()
}
class ObjectClass:ObjecProtocol {
@objc func requiredMethod() {
}
}
var r2 = Rect(x: 100, y: 200, w: 33, h: 2)
2.扩展(Extension),Swift中使用扩展的原则
不可以再扩展中定义存储属性,这是格式,定义了会报错,无法执行
可以再扩展中定义计算属性
extension Double{
//不可以在扩展中定义存储属性
//错误 var i = 10
//可以在扩展中定义计算属性
var km:Double {
return self/1000.0
}
var cm:Double {
return self * 100.0
}
/** 扩展一个方法实现四舍五入*/
func round()->Int{
//整数情况
return Int(self + 0.5)
}
}
350.0
print(350.5.km)
print(350.5.cm)
print(350.49.round())
print(350.50.round())
struct Point {
var x = 0.0
var y = 0.0
}
struct Size {
var w = 0.0
var h = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
var r = Rect()
//通过扩展一个带有四个参数的初始化器使得Rect在初始化的时候可以同时赋上四个值
extension Rect {
init(x:Double,y:Double, w:Double, h:Double){
self.origin = Point(x: x, y: y)
self.size = Size(w: w, h: h)
}
}
//其实上面的操作和OC里面的 -(id)initWithName:(NSString*)name andAge:(int) age{ if (self = [super init]; self.name = name, self.age = age)}功能是差不多的,只是表现形式不同而已
还可以通过扩展对系统类型的空间进行增加方法或者计算值属性
extension UIButton {
func show(){
print(self.tag)
}
}
3. 泛型(genericity): 字面意思理解就是广泛地被使用的类型,言外之意可以充当很多中类型。并且在赋值的时候它会根据系统的自动推倒公司变成制定的类型(Swift语言所期望的类型)
比如当我有很多个不同类型它门需要调换值,且实现逻辑一样。
函数+<T>指定T是一个泛型 T就代表各种类型的类型了
func swapTwoValues<T>(inout a:T,inout b:T) {
let temp = a
a = b
b = temp
}
swap(&str1, &str2)
str1
str2
/**类型的范型 Array<Double 属于一个类型> */
var arr:Array<Double> = Array()
struct Instack {
private var items = [Int]()
/**栈的特点后进先出*/
mutating func push(item:Int){
items.append(item)
}
mutating func pop(item:Int){
items.removeLast()
}
}
/**T属于一个类型函数,必须根据用户制定,通过Stack制定T(数组中元素的类型)*/
struct Stack<T> {
private var items = [T]() //一个任意类型的数组,当T被指定为什么类型,那么该数组就为什么类型]
/**这里利用栈的特定,后进先出 构造一个数组*/
mutating func push(item:T){
items.append(item)
mutating func pop(item:T){
items.removeLast()
}
}
var intStack:Stack<Int> = Stack()
var StringStack:Stack<String> = Stack()
4. 访问控制public表示在任何地方都能访问
internal表示在本项目能访问,为了限制类成员的作用阈在类的作用阈范围内,所以在类的内部不能使用public
private 职能在本.xxx文件中访问
/** 任何地方都可以访问*/
public class AClass {
}
/** 在本项目中访问*/
internal class IClass {
}
/**限于本文件中*/
private class CClass {
}
/** internal*/
class FClass {
//属性的权限不能高于类 public var = c = 2
internal var a = 10
private var b = 20
}
var fc:FClass = FClass()
fc.a
fc.b
5. 异常处理:非常有用,尤其在后续开发设计用户体验度相关问题的时候。**********************
/**异常处理(exception) ,这是OC常用的描述,而在我们的Swif提供了一类错误的支持,包括运行时抛出错误,捕捉错误,以及控制收回错误,使用了一个符合的ErrorType协议来表示。
1. 定义错误type,一般为枚举值,需要用一个值把程序中的问题表达出来
2. 根据不同的运算结果返回不同的ErrorType枚举值
3. 处理抛出的异常,通常采用 throws{ } 方法来判断不同的逻辑值后再调用throw选择性的抛出错误值
4. 处理抛出的异常,采用 do { try } catch 枚举值{ }catch枚举值{ },这样一个循环监听事件,持续的尝试去判断逻辑抛出一异常,然后执行接收异常。
*/
/** 自动售货机的Error*/
enum VendingMachineError:ErrorType {
case InvalidSelection //没有物品或者选择错误,选择物品错误
case OutOfStock //超出了范围,数量不够
case InsufficentFounds(required:Double) //前不够,差多少
}
/** 商品条目*/
struct Item {
var price:Double
var count:Int
}
/** 商品的数组*/
var inventory = ["可乐":Item(price: 1.25, count: 0),"
6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器的更多相关文章
- C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法
1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName ...
- 窥探Swift之类的继承与类的访问权限
上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...
- Swift 之类的继承与类的访问权限
http://www.cocoachina.com/swift/20160104/14821.html 上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swi ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- Linux 文件访问权限
定义:<sys/stat.h> 每个文件有9个访问权限,可将其分为3类: 标记 含义 S_IRUSR 用户读 S_IWUSR 用户写 S_IXUSR 用户执行 S_IRGRP 组读 S_I ...
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
- java的访问权限
Java语言中有4中访问修饰符:friendly(默认).private.public和protected. public :能被所有的类(接口.成员)访问. protected:只能被本类.同一个包 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- Java编程思想学习(四) 访问权限
几种访问权限修饰词 public,protected,private,friendly(Java中并无该修饰词,即包访问权限,不提供任何访问修饰词) 使用时,放置在类中成员(域或方法)的定义之前的,仅 ...
随机推荐
- 后移动互联网时代:到底还要不要开发一个App?
后移动互联网时代,到底是什么样的一个时代? 首先,后移动互联网时代中,产生头部应用的几率变小了,像微信这样巨头式的App很难在产生第二个.其次,后移动互联网时代,物联网发展迅速,所有的智能硬件都需要一 ...
- ios-将代码创建的视图控件放入拖拽控件的下面
如图所示 图片是拖拽上去的imageView,橘黄色控件是在代码中创建的添加上去的,此时黄色view在imageView 上方 调用方法bringSubviewToFront:试图将imageView ...
- Android JNI 本地开发接口
前言 我们为什么要用JNI --> 高效.扩展 高效:Native code效率高,数学运算,实时渲染的游戏上,音视频处理 (极品飞车,opengl,ffmpeg,文件压缩,图片处理-) 扩展: ...
- Java学习手记1——集合
一.什么是集合 集合是对象的集合,就像数组是数的集合.集合是一种容器,可以存放对象(可以是不同类型的对象). 二.集合的优点(为什么要用集合) 当然,在java里,可以使用数组来存放一组类型相同的对象 ...
- 19.在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?)写出http常见的状态码和含义,至少5个.[完善题目]
状态401代表未被授权,header("Location:www.xxx.php"); 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. 300 ...
- JAVA序列化和反序列化
http://developer.51cto.com/art/201202/317181.htm http://blog.csdn.net/earbao/article/details/4691440 ...
- 【004: gcc 和 clang 的简单比较】
- 更改MyEclipse 之 jsp、js、java、xml文件字体大小设置
1.打开eclipse->window-->prefercess--->general--->appearance-->color and font ----> B ...
- Spring学习笔记之三----基于Annotation的Spring IOC配置
使用Annotation 来创建Bean有两种方式 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bea ...
- wex5 实战 HeidiSQL 导入Excel数据
一 前言 以前没做过大东西,突然客户说,我给你个数据,你部署到云上.我想,很简单啊,随口答应了. 悲剧发生了,客发给我的,居然是一张excel表!!! 本来想一条一条数据复制,一看,2000多条!! ...