本文是我在写第一个Swift项目时,总结的小知识点 因为从OC学习而来,只是简单的学了基本语法,在准备写的过程中,问题颇多。 没有像OC系统学习,还是挺不好弄的,只能一边写一边总结,最主要查资料也挺少的,慢慢都去看文档了,英文的头大啊,逼迫我们变优秀
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文件吧,所以只能写成全局常量和函数了,悲哀啊啊啊啊
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<UInt8>.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,不用只会报个警告 )
- 可以声明为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<</span>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<</span>U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
声明为可选类型的话,就代表它可能为nil(None),也可能有值(Some)
var configuration : VideoPlayerViewConfiguration?
- 可以声明为 !
var player : AVPlayer!
强制拆包,如果值为空,直接crash掉,狠啊
单例模式
class VPPlayer{
override private init() {
}
//单例
private static let sharedInstance = VPPlayer()
class func shareManager() -> VPPlayer {
return sharedInstance
}
}
字符串String
- 多行字符串:由三个双引号""“括起来的字符序列。注意:多行字符串文字的正文开始以及结束时,分隔符”""必须独占一行。多行字符串文字中包含换行符时,该换行符也会出现在字符串的值中。 如果只想使用换行符来简化代码的读取,而不希望换行符成为字符串值的一部分,请在这些行的末尾写一个反斜杠\
- 字符串之间可以用➕,+= 连接字符串