时间:2021-05-02
写在前面
接触swift也有段时间了,通过这段时间自己接触和借鉴别人的经验,记录几点关于swift的小技巧,虽然不是什么高深的原理知识,但是在平常的项目中用到或许可以提高开发效率呢,哈哈,接下来就简单总结一下:
枚举(ENUM)
结合一个小场景, 比如我们要做一个关于性别判断的一个小case:
可能我们首先想到的就是这样,硬编码写入,每次都需要手动输入
但是如果我们利用枚举来写的话:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 enum Gender { case man case female case other } var gType: Gender = .man switch gType { case .man: print("男性") case .female: print("女性") case .other: print("其他类型") default: print("我也不知道") }把需要的类型写到enum 中,就会减少不小心输入错误的几率,而且不在enum范围中的实例,编辑器也会指出。
空合运算符
比如我们要定义某个label的默认text, 也就是说,如果我们没有去人为设置,这个label就会用默认text显示,我们可能会这么写:
? 1 2 3 4 5 6 7 8 var customText: String? var defaultText = "您好" var textToUse = "" if let text = customText { textToUse = text } else { textToUse = defaultText }如果换种简单的写法就成了这样:
? 1 2 3 4 var customText: String? var defaultText = "您好" var textToUse = "" var textToUse = customText ?? defaultText?? 的意思就是如果textToUse为nil则选择defaultText 否则选择customText
函数式
比如我们获取10以内的奇数, 第一想法是,用for循环呀:
? 1 2 3 4 5 6 7 var arr = [Int]() for i in 1...10 { if i % 2 == 1 { arr.append(i) } } print(arr)当然了,必然可以计算出结果,如果换种思路呢,swift内置filter函数:
? 1 2 3 4 var arr = (1...10).filter { (num) -> Bool in num % 2 == 1 } print(arr)闭包 \ 函数
举个栗子,两个字符串拼接
使用函数:
? 1 2 3 4 func sum(a: String, b: String) -> String { return a + b } var result = sum(a: "你好", b:"哈哈哈")如果使用闭包的话:
? 1 2 3 4 var sumStringClosure: (String, String) -> String = { $0 + $1 } sumStringClosure("hello", "world")有木有感觉easy了好多
convenience init 便利初始化
我们声明一个类,给这个类设置变量然后将其初始化
? 1 2 3 4 5 6 7 8 9 10 11 class Animal { var dog: Int? var cat: Int? init(dog: Int, cat: Int) { self.dog = dog self.cat = dog } } var daDi = Animal(dag: 2, cat: 4) daDi.dog daDi.cat假如我们想在每次用到 Animal这个类的时候,我们想着给这个类中的dog和cat都设置好数量,我们就可以用convenience init来设置
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Animal { var dog: Int? var cat: Int? init(dog: Int, cat: Int) { self.dog = dog self.cat = dog } convenience init() { self.init(dog: 10, cat: 10) } } var daDi = Animal() daDi.dog daDi.cat属性观察
自从swift更新到swift3之后 我们发现 变量的set\get方法发生改变了有木有,添加了一个很方便的属性就是willSet和didSet,比如我们如果求一个正方形的周长,使用function的话是这样子的 :
? 1 2 3 4 5 var length :Double? func getDiameter(length: Double) -> Double { return length * 4 } getDiameter(length: 10)如果我们使用变量的属性观察方法:
? 1 2 3 4 5 6 7 8 9 10 11 var perimeter: Double? var length: Double? { willSet { print("准备赋值中") } didSet { perimeter = length! * 4 } } length = 20 perimeter willSet
是在属性发生改变之前调用的
didSet
是在属性发生改变之后调用的。
遍历方法
打印字符串:如果使用while 来
? 1 2 3 4 5 var i = 0 while i < 5 { print("irembeu") i += 1 }我们必须要定义一个变量来确保打印达到我们要求的次数,但是我们定义越多的变量就意味着出错的风险越大,所以还是尽量少写点儿代码,改成for循环版:
? 1 2 3 for _ in 1...10 { print("itembeu") }不需要我们定义多余变量,因为swift语法设计的时候用_来代替可以忽略的变量了
计算属性\ 函数
取圆的直径和半径:
1、使用函数:在这种情况下,我们根据半径求直径,根据已经直径求半径,需要写两个function
2、使用变量的计算属性
? 1 2 3 4 5 6 7 8 9 10 11 12 13 var radius: Double = 10 var diameter: Double { get { return radius * 2 } set { radius = newValue / 2 } } radius // 20 diameter // 40 diameter = 600 radius // 300我们知道直径和半径是相互依存的关系的,使用变量的计算属性这样看起来要比使用函数计算要简洁的多了。
泛型
如果我们需要将不同类型数组中的变量打印输出,我们可能会这样做:
? 1 2 3 4 5 6 var stringArr = ["骑士", "湖人", "公牛"] var intArr = [1, 3, 4, 5, 6] var doubleArr = [1.0, 2.0, 3.0] func printStringArr(a: [String]) { for s in a { print(s) } } func printIntArr(a: [Int]) { for i in a { print(i) } } func printDoubleArr(a: [Double]) {for d in a { print(d) } }我们需要定义不同类型的数组,如果类型多了,那我们做的无谓的工作就有点儿多了,这时候我们如果使用泛型来解决这个问题的话:
? 1 2 3 4 5 6 func printElementFromArr<T>(elements: [T]) { for e in elements { print(e) } } printElementFromArr(elements: [1,2,3,4])简单好多 有木有, 泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图。有参函数的参数必须有一个明确的参数类型,有些时候开发者会遇到这样一种情况,就像上面我们举的这个例子,由于变量有类型之分,实现相同的功能,可能需要重载成多个函数来实现,这大大浪费了开发成本,使用泛型,可以完美的解决这个问题。
拓展
swift 中没有了OC中的category 但是保留了extension, 我们和extension打交道的时候也就比较多了, 如果我们需要计算一个数的平方,我们可以声明一个函数, 像这样:
? 1 2 3 4 func squ(x: Int) -> Int { return x * x } var s = squ(x: 10) 那如果我们要求10 的4次方的话,我们就要var s = squ(x: 10)
squ(x: s)创建多余变量。
使用拓展:
简洁,不需要多创建变量。
Gaurd let \ if let
检验用户名和密码:
1、使用if let, 我们需要一层层的嵌套
? 1 2 3 4 5 6 7 8 9 var uName: Double? var uPassword: Double? func userLogIn() { if let username = uName { if let password = uPassword { print("欢迎, \(username)"!) } } }2、使用gaurd let, 如果uName或者uPassword为nil的话,程序就会走return方法,提前结束运行, 否则就会print("欢迎, \(username)!")
? 1 2 3 4 5 6 7 var uName: Double? var uPassword: Double? func userLogIn() { guard let username = uName, let password = uPassword else { return } print("欢迎, \(username)!") }声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
实际上很多人都开了淘宝网(电商运营网)店,有两个人合作经营一起开的,也是有自身独立开的,可是合作经营赚到钱的仿佛并不是很多,下边就为大伙儿共享一个别人小结的
效果图第一步:加载第二步:html小黄人小黄人小黄人小黄人小黄人删除小黄人小黄人小黄人小黄人小黄人删除第二步:css.item-wrap{overflow:hi
这是一篇关于防跟卖的新手帖,老司机可以自行忽略,本文主要针对个人小卖家,分享一些防跟卖的方法。作为刚入亚马逊行业的新手卖家,想要做好亚马逊,就务必要了解亚马逊的
前言Apple在Swift4.0中作了很多的改进,其中我个人最喜欢的就是Codable协议的出现。它让Swift自带了JSON、XML结构化数据和Model的映
讲讲网络推广吧,网络推广如今许多人小结出来各种各样推广的方式,可是现在我就在这里说下网站推广方式中大伙儿应当怎样去选择。 不必去作页之后的广告词。 经常预览