今日学习内容:
1.Swift 类型转换: is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。
1.1检查类型
class Subjects {
var physics: String
init ( physics : String) {
self. physics = physics
}
}
class Chemistry : Subjects {
var equations: String
init ( physics : String, equations : String) {
self. equations = equations
super. init ( physics : physics)
}
}
class Maths : Subjects {
var formulae: String
init ( physics : String, formulae : String) {
self. formulae = formulae
super. init ( physics : physics)
}
}
let sa = [
Chemistry ( physics : "固体物理" , equations : "赫兹" ) ,
Maths ( physics : "流体动力学" , formulae : "千兆赫" ) ,
Chemistry ( physics : "热物理学" , equations : "分贝" ) ,
Maths ( physics : "天体物理学" , formulae : "兆赫" ) ,
Maths ( physics : "微分方程" , formulae : "余弦级数" ) ]
let samplechem = Chemistry ( physics : "固体物理" , equations : "赫兹" )
print ( "实例物理学是: \(samplechem.physics)" )
print ( "实例方程式: \(samplechem.equations)" )
let samplemaths = Maths ( physics : "流体动力学" , formulae : "千兆赫" )
print ( "实例物理学是: \(samplemaths.physics)" )
print ( "实例公式是: \(samplemaths.formulae)" )
var chemCount = 0
var mathsCount = 0
for item in sa {
if item is Chemistry {
++ chemCount
} else if item is Maths {
++ mathsCount
}
}
print ( "化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题" )
以上程序执行输出结果为:
实例物理学是: 固体物理
实例方程式: 赫兹
实例物理学是: 流体动力学
实例公式是: 千兆赫
化学科目包含 2 个主题,数学包含 3 个主题
1.2向下转型
let sa = [
Chemistry ( physics : "固体物理" , equations : "赫兹" ) ,
Maths ( physics : "流体动力学" , formulae : "千兆赫" ) ,
Chemistry ( physics : "热物理学" , equations : "分贝" ) ,
Maths ( physics : "天体物理学" , formulae : "兆赫" ) ,
Maths ( physics : "微分方程" , formulae : "余弦级数" ) ]
let samplechem = Chemistry ( physics : "固体物理" , equations : "赫兹" )
print ( "实例物理学是: \(samplechem.physics)" )
print ( "实例方程式: \(samplechem.equations)" )
let samplemaths = Maths ( physics : "流体动力学" , formulae : "千兆赫" )
print ( "实例物理学是: \(samplemaths.physics)" )
print ( "实例公式是: \(samplemaths.formulae)" )
var chemCount = 0
var mathsCount = 0
for item in sa {
if let show = item as ? Chemistry {
print ( "化学主题是: '\(show.physics)', \(show.equations)" )
} else if let example = item as ? Maths {
print ( "数学主题是: '\(example.physics)', \(example.formulae)" )
}
以上程序执行输出结果为:
实例物理学是: 固体物理
实例方程式: 赫兹
实例物理学是: 流体动力学
实例公式是: 千兆赫
化学主题是: '固体物理', 赫兹
数学主题是: '流体动力学', 千兆赫
化学主题是: '热物理学', 分贝
数学主题是: '天体物理学', 兆赫
数学主题是: '微分方程', 余弦级数
1.3Any 实例
var exampleany = [ Any ] ( )
exampleany. append ( 12 )
exampleany. append ( 3.14159 )
exampleany. append ( "Any 实例" )
exampleany. append ( Chemistry ( physics : "固体物理" , equations : "兆赫" ) )
for item2 in exampleany {
switch item2 {
case let someInt as Int :
print ( "整型值为 \(someInt)" )
case let someDouble as Double where someDouble > 0 :
print ( "Pi 值为 \(someDouble)" )
case let someString as String :
print ( "\(someString)" )
case let phy as Chemistry :
print ( "主题 '\(phy.physics)', \(phy.equations)" )
default :
print ( "None" )
}
以上程序执行输出结果为:
整型值为 12
Pi 值为 3.14159
Any 实例
主题 '固体物理', 兆赫
1.4AnyObject 实例
let saprint: [ AnyObject ] = [
Chemistry ( physics : "固体物理" , equations : "赫兹" ) ,
Maths ( physics : "流体动力学" , formulae : "千兆赫" ) ,
Chemistry ( physics : "热物理学" , equations : "分贝" ) ,
Maths ( physics : "天体物理学" , formulae : "兆赫" ) ,
Maths ( physics : "微分方程" , formulae : "余弦级数" ) ]
let samplechem = Chemistry ( physics : "固体物理" , equations : "赫兹" )
print ( "实例物理学是: \(samplechem.physics)" )
print ( "实例方程式: \(samplechem.equations)" )
let samplemaths = Maths ( physics : "流体动力学" , formulae : "千兆赫" )
print ( "实例物理学是: \(samplemaths.physics)" )
print ( "实例公式是: \(samplemaths.formulae)" )
var chemCount = 0
var mathsCount = 0
for item in saprint {
if let show = item as ? Chemistry {
print ( "化学主题是: '\(show.physics)', \(show.equations)" )
} else if let example = item as ? Maths {
print ( "数学主题是: '\(example.physics)', \(example.formulae)" )
}
}
2.Swift 扩展:一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议
2.1计算型属性
extension Int {
var add : Int { return self + 100 }
var sub: Int { return self - 10 }
var mul: Int { return self * 10 }
var div: Int { return self / 5 }
}
let addition = 3 . add
print ( "加法运算后的值:\(addition)" )
let subtraction = 120 . sub
print ( "减法运算后的值:\(subtraction)" )
let multiplication = 39 . mul
print ( "乘法运算后的值:\(multiplication)" )
let division = 55 . div
print ( "除法运算后的值: \(division)" )
let mix = 30 . add + 34 . sub
print ( "混合运算结果:\(mix)" )
以上程序执行输出结果为:
加法运算后的值:103
减法运算后的值:110
乘法运算后的值:390
除法运算后的值: 11
混合运算结果:154
2.2向类中添加新的便利构造器 init()
struct sum {
var num1 = 100 , num2 = 200
}
struct diff {
var no1 = 200 , no2 = 100
}
struct mult {
var a = sum ( )
var b = diff ( )
}
extension mult {
init ( x : sum, y : diff) {
_ = x. num1 + x. num2
_ = y. no1 + y. no2
}
}
let a = sum ( num1 : 100 , num2 : 200 )
let b = diff ( no1 : 200 , no2 : 100 )
let getMult = mult( x: a, y: b)
print ( "getMult sum\(getMult.a.num1, getMult.a.num2)" )
print ( "getMult diff\(getMult.b.no1, getMult.b.no2)" )
以上程序执行输出结果为:
getMult sum ( 100 , 200 )
getMult diff ( 200 , 100 )
2.3向Int类型添加一个名为 topics 的新实例方法:
extension Int {
func topics ( summation : ( ) -> ( ) ) {
for _ in 0 .. < self {
summation ( )
}
}
}
4 . topics ( {
print ( "扩展模块内" )
} )
3 . topics ( {
print ( "内型转换模块内" )
} )
以上程序执行输出结果为:
扩展模块内
扩展模块内
扩展模块内
扩展模块内
内型转换模块内
内型转换模块内
内型转换模块内
2.4修改该实例本身
extension Double {
mutating func square ( ) {
let pi = 3.1415
self = pi * self * self
}
}
var Trial1 = 3.3
Trial1. square ( )
print ( "圆的面积为: \(Trial1)" )
var Trial2 = 5.8
Trial2. square ( )
print ( "圆的面积为: \(Trial2)" )
var Trial3 = 120.3
Trial3. square ( )
print ( "圆的面积为: \(Trial3)" )
以上程序执行输出结果为:
圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735
2.5添加新下标。
extension Int {
subscript ( multtable : Int) -> Int {
var powerOf10 = 1
var index = multtable
while index > 0 {
powerOf10 *= 10
index -= 1
}
return ( self / powerOf10) % 10
}
}
print ( 12 [ 0 ] )
print ( 7869 [ 1 ] )
print ( 786543 [ 2 ] )
以上程序执行输出结果为:
2
6
5
2.6向已有的类、结构体和枚举添加新的嵌套类型:
extension Int {
enum calc
{
case add
case sub
case mult
case div
case anything
}
var print: calc {
switch self
{
case 0 :
return . add
case 1 :
return . sub
case 2 :
return . mult
case 3 :
return . div
default :
return . anything
}
}
}
func result ( numb : [ Int ] ) {
for i in numb {
switch i. print {
case . add :
print ( " 10 " )
case . sub:
print ( " 20 " )
case . mult:
print ( " 30 " )
case . div:
print ( " 40 " )
default :
print ( " 50 " )
}
}
}
result ( [ 0 , 1 , 2 , 3 , 4 , 7 ] )
以上程序执行输出结果为:
10
20
30
40
50
50