你不知道的Swift

栏目: Swift · 发布时间: 6年前

内容简介:除了❤,类似☢、☂、☯等都可以用,而且这些符号都是可以组合起来的​​
infix operator ❤ : MultiplicationPrecedence
func ❤(lhs: Int, rhs: Int) -> Int { return lhs + rhs }
r = 1 ❤ 5	// 结果是6

除了❤,类似☢、☂、☯等都可以用,而且这些符号都是可以组合起来的

空集合,是无法判断出有效类型的

let arr = [Int]()
if arr is [String] {
    print("Match!!")	// 会输出Match!!
}

可变参数,在函数内部就是数组

func test(params: String...) {
    let t = type(of: params)
    print(t)	// 输出:Array<String>
    print(params)	// 输出:["1", "2"]
}
test(params: "1", "2")

Optional类型,也是有map方法的

let i: Int? = 10
let r = i.map { $0 + 1 }
print(r)	// Optional(11)

有些场景下可以极大简化代码

print是有更多参数可用的

print("Hello", "World", separator: " ")	// 输出Hello World,中间用空格分割
// 下面两句输出: HelloWorld,不会换行
print("Hello" terminator: "")
print("World")

除此之外还有debugPrint,可能会输出更详细的信息

~= 可以很方便判断值是否在区间内

let r = 1...5 ~= 3
print(r)	// 输出:true

switch判断,可以更强大

case后面跟可以不同类型,但需要重载 ~= 运算符

struct Person {
    let name : String
}

func ~=(pattern: String, value: Person) -> Bool {
    return value.name == pattern
}

let person = Person(name: "Alessandro")
switch person {
case "Alessandro":
    print("Hey it's me!")
default:
    print("Not me")
}

空元组,可以在不关心类型及数据时使用

func emptyTuple(_: ()) {
    // some code
}
emptyTuple(())	// 调用时也需要传入空元组

在Rx中,是有大量这样的使用,比如事件通知,不需要传数据,只要触发一下的情况,可能会用()

Swift中,Void也是用的空元组来定义的

public typealias Void = ()

一起遍历两个Sequence时,可以用zip

let lst1 = [1, 2, 3]
let lst2 = ["a", "b", "c", "d"]
for (a, b) in zip(lst1, lst2) {
    print("\(a)\(b)")	// 输出1a 2b 3c,以短的列表为准
}

全局变量默认就是lazy的

func globalFunc() -> Int {
    print("Hello")
    return 42
}
var globalVar = globalFunc()	// 只有globalVar被使用时,globalFunc才会被调用

苹果源码仓库里有相应的测试代码,可以详细看到什么情况下会是懒加载: lazy_properties.swift

precondition,比assert更严格的检查

用法上与assert类似,但更严格,只有-Ounchecked选项才能关闭,但这样会很危险

precondition(x >= 0)

struct在没有自定义init时,系统会帮我们生成

struct MySize {
    var width: CGFloat = 0
    var height: CGFloat = 0
}
let s1 = MySize(width: 1, height: 1)
let s2 = MySize()	// 如果上面没有指定默认值,则不会生成这个初始化方法

compactMap可以从列表中筛选出指定类型

let arrs: [Any] = [1, 2, "3", "4", 5]
let r = arrs.compactMap { $0 as? String }	// r已经被推断为[String]类型
print(r)	// 输出:["3", "4"]

从Dictionary获取值时,可以提供默认值

let dict = ["1": 1]
let o = dict["2", default: 2]
print(o)	// 输出:2

运算符也是方法

let r = (+)(5, 6)
print(r)	// 输出:11


以上所述就是小编给大家介绍的《你不知道的Swift》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

赢在设计

赢在设计

[美] 洛芙迪 (Lance Loveday)、[美] 尼豪斯 (Sandra Niehaus) / 刘淼、枊靖、王卓昊 / 人民邮电出版社 / 2010-8 / 55.00

企业总是面临在网站设计和改进方面进行投资的抉择。怎样才能让有限的资金发挥出最大的效益呢?网站设计不应只是把网站做得赏心悦目,它更应该是提高经济收益和获得竞争优势的战略利器。是时候让网站发挥其潜能,以业务指标为导向来做设计决策,为提升网站收益而设计了。 作者凭借多年为众多网站做咨询工作的经验,为我们揭示了赢在设计的奥秘。它针对目前网站设计中存在的典型问题,先从宏观上探讨解决问题的战略手段,围绕......一起来看看 《赢在设计》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具