Swift 小知识总结

本文是我在写第一个Swift项目时,总结的小知识点
因为从OC学习而来,只是简单的学了基本语法,在准备写的过程中,问题颇多。
没有像OC系统学习,还是挺不好弄的,只能一边写一边总结,最主要查资料也挺少的,慢慢都去看文档了,英文的头大啊,逼迫我们变优秀

Swift初始化方法

  • Swift:必须添加init?(coder decoder: NSCoder)的原因
  • 全能初始化方法
    顾名思义,就是全部属性都必须初始化
    全能初始化方法必须调用父类的全能初始化方法
class GameCharacter {
    var weapon: String
    
    init() {
        self.weapon = "fist"
    }
    
    init(weapon: String) {
        self.weapon = weapon
    }
}
  • 便利初始化
    初始化部分属性,但是最终必须调用当前类的全能初始化方法
class Warrior: GameCharacter {
    var shield: String
    
    init(weapon: String, shield: String) {
        self.shield = shield
        super.init(weapon: weapon)
    }
    
    convenience init(shield: String) {
        self.init(weapon: "fist", shield: shield)
    }
}

关于Swift中不能使用宏定义

本来想着创建一个桥接文件,将OC中的宏定义文件import,但是实践证明并没有用,大概桥接文件和宏文件都是.h文件吧,所以只能写成全局常量和函数了,悲哀啊啊啊啊
https://www.cnblogs.com/JianweiWang/p/5142306.html

16进制转换颜色

因为Swift并没有系统提供

func PLAYER_UIColorFromHEXA(hex: Int, alpha: CGFloat) -> UIColor {
    
    let redValue = CGFloat((hex & 0xFF0000) >> 16)/255.0
    let greenValue = CGFloat((hex & 0xFF00) >> 8)/255.0
    let blueValue = CGFloat(hex & 0xFF)/255.0
    return UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: alpha)
}

NSURLSession改为URLSession

文件操作

var isDir : ObjCBool = false
var isDirExist = fileManager.fileExists(atPath: path, isDirectory:&isDir)
if !(isDirExist && isDir.boolValue) {
            <#code#>
        }

MD5加密算法

就只调用 CC_MD5
var origin_str = string.utf8

    let digestLen = Int(CC_MD5_DIGEST_LENGTH)
    let result = UnsafeMutablePointer.allocate(capacity: digestLen);
    //UnsafeRawPointer指针操作
    CC_MD5(UnsafeRawPointer(&origin_str), CC_LONG(strlen(string)), result);
    let i = 0
    let outPutStr : NSMutableString = .init(capacity: 10)
    while i < CC_MD5_DIGEST_LENGTH {
        outPutStr.appendFormat("%02X", result[i])
    //小写x表示输出的是小写MD5,大写X表示输出的是大写MD5
    }

必要初始化器

 required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

遵守了遵守了NSCoding protoaol的所有类必须继承,像UIView和UIViewController系列的类。只是有的情况会隐式继承,而有的情况下需要显示实现。
当我们在子类定义了指定初始化器(包括自定义和重写父类指定初始化器),那么必须实现required init?(coder aDecoder: NSCoder) ,其他情况则会隐式继承

声明变量

Swift用var定义的变量,和别的语言不同,不会给变量自动附初始值,所以要求必须初始化,如果不初始化就会报错(想想OC,不用只会报个警告 )

  1. 可以声明为Optional可选类型
    巍大神总结到:
    Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因, 也是PlayGround会把Optional值显示为类似{Some “hello world”}的原因,这里是enum Optional的定义:
enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)
 
    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool
 
    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}

声明为可选类型的话,就代表它可能为nil(None),也可能有值(Some)

var configuration : VideoPlayerViewConfiguration?
  1. 可以声明为 !
var player : AVPlayer!

强制拆包,如果值为空,直接crash掉,狠啊

单例模式

class VPPlayer{
    override private init() {
        
    }
    //单例
    private static let sharedInstance = VPPlayer()
    class func shareManager() -> VPPlayer {
        return sharedInstance
    }
}

字符串String

  • 多行字符串:由三个双引号""“括起来的字符序列。注意:多行字符串文字的正文开始以及结束时,分隔符”""必须独占一行。多行字符串文字中包含换行符时,该换行符也会出现在字符串的值中。 如果只想使用换行符来简化代码的读取,而不希望换行符成为字符串值的一部分,请在这些行的末尾写一个反斜杠\
  • 字符串之间可以用➕,+= 连接字符串

你可能感兴趣的:(Swift 小知识总结)