Swift小技巧(四)

.如何判断运行的设备类型,比如是iPad还是iPhone
 //判断设备类型,iPad或者iPhone
if UIDevice.current.userInterfaceIdiom == .pad {
    print("设备是iPad")
}else if UIDevice.current.userInterfaceIdiom == .phone {
    print("设备是iPhone")
}
如何快速给方法、属性等添加文档
 func chreatString(name: String) -> String {
        return "你好,\(name)"
    }

然后在方法上一行使用:command + option + / 快捷键,会出现如下所示:
然后点击该方法,就能在属性观察器中查看到文档了
62efaaf90d8ff836f332c3514a19f494.png

使用try?和try!处理异常
 //会抛出异常的方法
func someThrowingFunction() throws -> Int {}

//可以使用try?来调用,如果没有抛出异常,则返回x=Int?类型的值,抛出异常,则x=nil
let x = try? someThrowingFunction()
//try?和下方的代码是等价的
let y: Int?
do {
    y = try someThrowingFunction()
} catch {
    y = nil
}

//try!则是,如果抛出异常,程序会终止,不抛出,则返回解包后的值。try!用于100%确定不会抛出异常时使用
如何判断一个变量是否是某个类型
 class Test {}

let test = Test()

print(type(of: test))//Test
print(Test.self)//Test
type(of: test) == Test.self//true

//判断Array
let arr = [1, 3]
type(of: arr) == Array<Int>.self//true
class和static的区别

class和static都表示类属性或者类方法。区别在于
static相当于就是class final,不能够被重写

 class A {
    class func func1() -> String {
        return "1"
    }
    static func func2() -> String {
        return "2"
    }
}
class B: A {
    //正常使用,不会报错
    override class func func1() -> String {
        return "a"
    }
    //会报错,那是因为不能够重写static修饰的类方法
    override static func func2() -> String {
        return "b"
    }
    //可以看出,static相当于就是class final,不能够被重写
}
data与string互相转换
 //data->string
let dataStr = String(data: data, encoding: .utf8)
//string->data
let data = "DataString".data(using: .utf8)
如何判断app是否是首次打开
 //如何记录用户是否是第一次打开app
let userDefaults = UserDefaults.standard
if userDefaults.bool(forKey: "hasRunBefore") == false {
    //可以在这里清空以前保存的钥匙串的内容,或者做别的操作,比如加载首次打开的欢迎界面等
    
    //接下来更新userdefaults
    userDefaults.set(true, forKey: "hasRunBefore")
    userDefaults.synchronize()
}
保留指定位数的小数,进行四舍五入
 extension Double {
    //保留指定位小数,四舍五入
    func roundTo(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
let x = 0.123456.roundTo(places: 5)//0.12346
GCD实现子线程执行任务
 //后台执行操作
DispatchQueue.global(qos: .background).async {
    print("子线程执行")
    DispatchQueue.main.async {
        print("子线程执行")
    }
}

//可以扩展一个方法,增加延时和执行完成后的回调处理
extension DispatchQueue {
    static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
        DispatchQueue.global(qos: .background).async {
            background?()
            if let completion = completion {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                    completion()
                })
            }
        }
    }
}
//使用
DispatchQueue.background(delay: 3.0, background: {
    //后台要执行的操作
    }, completion: {
        //后台执行完成后,延时3秒执行回调
})

DispatchQueue.background(background: {
    //后台要执行的操作
    }, completion:{
        //后台执行完成后,就执行回调
})

DispatchQueue.background(delay: 3.0, completion:{
    //不需要后台执行任何操作,延时3秒执行回调
})
oc中的isKindOfClass方法,在swift中如何使用
 //在OC中,这样使用
if ([touch.view isKindOfClass: UIPickerView.class]) {
}
//swift中,使用is
let x: Any = "x"
if x is String {
    print("true")
}
如何实现nsrange与range之间的互相转换
 extension String {
    func nsRange(from range: Range<String.Index>) -> NSRange {
        let from = range.lowerBound.samePosition(in: utf16)
        let to = range.upperBound.samePosition(in: utf16)
        return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),
                       length: utf16.distance(from: from, to: to))
    }
}

extension String {
    func range(from nsRange: NSRange) -> Range<String.Index>? {
        guard
            let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
            let to16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location + nsRange.length, limitedBy: utf16.endIndex),
            let from = from16.samePosition(in: self),
            let to = to16.samePosition(in: self)
            else { return nil }
        return from ..< to
    }
}
//使用
let str = "a👿b🇩🇪c"
let r1 = str.range(of: "🇩🇪")!

// range -> NSRange:
let n1 = str.nsRange(from: r1)
print((str as NSString).substring(with: n1)) // 🇩🇪

// NSRange -> range:
let r2 = str.range(from: n1)!
print(str.substring(with: r2)) // 🇩🇪
如何生成UUID
 let uuid1 = UUID().uuidString
如何实现base64string与string之间的互相转换
 let plainString = "你好"
//string -> base64string
let plainData = plainString.data(using: .utf8)
let base64string = plainData?.base64EncodedString()
print(base64string!)//5L2g5aW9

//base64string -> string
if let decodedData = Data(base64Encoded: base64string!) {
    let decodedString = String(data: decodedData, encoding: .utf8)
    print(decodedString!)//你好
}
posted @ 2020-10-10 16:45  怕腥的鱼  阅读(224)  评论(0编辑  收藏  举报