Swift5类型转换
swift中值永远不会隐式转换为另一种类型。如果需要将值转换为其他类型,请显式创建所需类型的实例.
let value = 12
let str = "age"
let res = str + String(value)
// 错误写法 let res = str + value 这种是没有类型推断的,甚至于在编写时就会报错 cannot be applied to operands of type 'String' and 'Int'
print(res)
// 结果: age12
Swift5字符串快速拼接
- 拼接变量或者常量使用: \()
let apples = 5
let appleSummary = "I have \(apples) apples."
print(appleSummary)
// 结果: I have 5 apples.
\() 也可以用于浮点计算,如\(A+B)
- 字符串折行
使用: """
let value = """
Just like "The Shawshank Redemption",
"I guess it comes down to a simple choice: Get busy living, or get busy dying. Busy living, or busy dying."
"""
print(value)
Swift5 if 条件判断
if语句中条件必须是布尔值或者表达式,而不是与零或者空的隐式比较。
在OBJC 中,你可以这样写:
NSString *str;
if (str) {
NSLog(str);
}
在swift 中则不行,你可以这样写
var str: String
str = "aaa"
str = ""
...// 其他操作
if str.count > 0 {
print(str);
}
Swift5 可选值处理
处理方式很多,如if ,switch ,下面介绍一种ios中没有的 ??,
var str: String? = "aaa"
str = nil
var defaultValue = "bbb"
print(str ?? defaultValue)
其实它就是个三目,写法改变了而已
Swift5至少执行一次的repeat while(do-while in objc) 和 while
var a = 2
repeat {
a = 2 * a
print(a)
} while a < 2
// 结果: 4
var b = 2
while b < 2 {
b = 2 * b
print(b)
}
// 结果:
Swift5特别方便的元组使用
在objc中方法返回多个参数时,要么数组,要么字典,必须得去构建个参数,swif使用元组t写法上则方便很多
override func viewDidLoad() {
super.viewDidLoad()
let result = filter(scores: [1,5,3,7,90,45])
print(result)
//结果: (min: 1, max: 90, sum: 151)
}
func filter(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}
return (min, max, sum)
}
Swift5方法作为参数,方法作为传参,方法嵌套
这也是OC里面没有的,以下方法实现功能:求 平均年龄:最高学分,仅做演示功能需要,实际肯定不必这样写
override func viewDidLoad() {
super.viewDidLoad()
// 年龄数组
let a:[Float] = [14, 15, 16, 14]
// 学分数组
let b:[Float] = [80, 90, 96, 88]
let result = setupParam(infoA: a, funcB: dealAge)
print(result(b))
// 结果: (averageAge: 14.75, averageCredit: 96.0)
}
// 求平均年龄
func dealAge(ages: [Float]) -> Float {
var total:Float = 0.0
for age in ages {
total += age
}
if ages.count > 0 {
return total/Float(ages.count)
}
return 0
}
// 方法作为参数,方法作为返回值 求 平均年龄:最高学分
func setupParam(infoA: [Float], funcB: ([Float]) -> Float) -> (([Float]) ->(averageAge: Float, averageCredit: Float)) {
// 平均年龄
let age = funcB(infoA)
// 方法嵌套
func avrage(numbers:[Float]) -> (avAge: Float, avCredit:Float) {
let best = numbers.max() ?? 0
return (age, best)
}
return avrage
}
Swift5枚举
Swift会分配从零开始的原始值,并每次递增一,但是您可以通过显式指定值来更改此行为
enum Poker: Int {
case ace = 1
case two, three, four, five, six, seven, eight, nine, ten
case eleven, twelve, thirteen
func translate() -> String {
switch self {
case .ace:
return "A"
case .eleven:
return "J"
case .twelve:
return "Q"
case .thirteen:
return "K"
default:
return String(self.rawValue)
}
}
}
let value = Poker.ace
print(value.translate())
// 结果: A
Swift5协议
使用protocol申报的协议,类,枚举和结构都可以采用协议。
protocol MyProtocol {
var param: String { get }
mutating func adjust()
}
class classB: MyProtocol {
var param: String = "MyProtocol"
func adjust() {
param += " description"
print(param)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let a = classB()
a.adjust()
// 结果:MyProtocol description
}
Swift5类扩展
用于extension向现有类型添加功能,例如新方法和计算属性。
extension ViewController {
var viewDes: String {
return "ViewController des"
}
func printViewDes() -> String {
return "extentions method \(viewDes)"
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let des = printViewDes()
print(self.viewDes, des)
// 结果 ViewController des extentions method ViewController des
}
}
Swift5错误处理
先定义一个代表错误的枚举
enum MyError: Error {
case lengthError, tooMuchError, tooLittleError
}
override func viewDidLoad() {
super.viewDidLoad()
let str = "sdsadasdassssssss"
do {
let printerResponse = try checkContent(content: str)
print(printerResponse)
} catch {
print(error)
}
// 结果:tooMuchError
}
func checkContent(content: String) throws -> String {
if content.count > 10 {
throw MyError.tooMuchError
} else if content.count < 5 && content.count > 0 {
throw MyError.tooLittleError
} else if content.count == 0 {
throw MyError.lengthError
} else {
print("valid");
}
return "checkContent done"
}
Swift5 字符串(String)操作
Swift5 字符(Character)操作
Swift5 数组(Array)操作
Swift5 字典(Dictionary)操作
Swift5 集合(Set)操作
Swift5 简单使用
Swift OC动态调试工具 InjectionIII 使用