Framework的那些事

写在前面:
回想了一下这个项目,接手到现在也就是一个多月,真正难过的或许也只是理解Java代码并变成Swift,和后面联调的过程。多的不说,记录一下遇到的问题,争取能巩固,提高技术。


还需要一点点前奏:
现在Framework的制作方法真是,只要你想找,总有你要的。所以我挑了一个内容丰富一点的,供您参考。iOS 制作静态库 .a 文件 和 .framework 文件 以及解决第三方库冲突问题 (转载 mark 一下) - Luck_Developer的博客 - 博客频道 - CSDN.NET


进入正题:
那么现在,一个空的Framework应该已经被搭建完成并且编译通过了。其实本来我也只是想讲讲代码问题 :)。不得不说,关键在于,Swift严格的类型检查给我在调用C的Api的时候带来了不少小麻烦。


Q1.Java的[Byte]如何在Swift中实现?
A: Java的Byte数据类型,真身就是Int8。那么,我们只要:

typealias Byte = Int8

然后给String加一个扩展方法就可以啦

extension String
{
    func getBytes()->[Byte]
    {
        var byteArray = [Byte]()
        
        for char in utf8
        {
            byteArray.append(Byte(char))
        }
        
        return  byteArray
    }
}```
*****
Q2.Java字符串的```trim```方法如何在Swift中实现?
A:  同样只要给String加一个扩展方法

extension String
{
func trim()->String
{
return contains(" ") ? trimmingCharacters(in: CharacterSet(charactersIn: " ")) : self
}
}

*****
Q3.那么,有时候Swift会把C的Api中,Java的```Byte```类型,识别成```UInt8```,导致参数要求是```[Byte]```,实际必须传```[UInt8]```(Swift:没错,我说它是```UInt```,你就得传```UInt```!),怎么破?
A:  多的不说见代码。**不过,千万不要轻易尝试类似如下的代码:** 

let num1:Int8 = 0
let num2 = UInt8(num1)

__正确的⬇️⬇️__

func toInt8Array(arr:[UInt8])->[Int8]
{
var temp = Int8
for c in arr
{
temp.append(Int8(bitPattern: c))
}
return temp
}

func toUInt8Array(arr:[Int8])->[UInt8]
{
var temp = UInt8
for c in arr
{
temp.append(UInt8(bitPattern: c))
}
return temp
}


而且,我不会说我把好的东西都放在后面。

*****
Q4.Java中,arrayCopy这样的操作在Swift中如何实现?
A: 确实拿到手后纠结了一小会。多的不说你们自己看代码

func arrayCopy<T>(src:Array<T>,srcPos:Int,dest:Array<T>,destPos:Int,length:Int)->Array<T>
{
var temp = dest

for i in 0..<length
{
    if i < src.count
    {
        temp[destPos + i] = src[srcPos + i]
    }
}
return temp

}

这里写了一个__泛型__函数,不知道什么是泛型以及在这个函数中作用的,请问问度娘,她会教你的:)
*****
__Q5.各种算法__
一直很赞同算法是一个好程序的灵魂。
**Base64---Encode:**

internal func base64Encode(array:[UInt8])->String
{
return Data.init(bytes: array, count: array.count).base64EncodedString(options: Data.Base64EncodingOptions.endLineWithLineFeed)
}
internal func base64Encode(array:[Int8])->String
{
return Data.init(bytes: array, count: array.count).base64EncodedString(options: Data.Base64EncodingOptions.endLineWithLineFeed)
}

By the way,```internal```关键字是因为我写在了一个单独的文件中,不熟悉的可以去查一下访问控制。这里写两个方法呢,也只是为了应付@Swift,(sad face)
**Base64---Decode:**

internal func base64Decode(base64String:String)->[UInt8]
{
let data = Data.init(base64Encoded: base64String, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!

var tempArr = [UInt8]()

for i in 0..<data.count
{
    tempArr.append(data[i])
}
return tempArr

}

so,不要问我代码里为什么直接```!```,而不用```if let { }```或者```guard let else { throw }```,我相信你注意到了形参名是什么~

**SHA1**

internal func sha1(string: String) -> String
{
var Sha1Result = ""

if let data = string.data(using: String.Encoding.utf8)
{
    var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
    
    CC_SHA1((data as NSData).bytes, CC_LONG(data.count), &digest)

    
    for index in 0..<CC_SHA1_DIGEST_LENGTH
    {
        Sha1Result += String(format: "%02x", digest[Int(index)])
    }
}
return Sha1Result

}

**CRC32**
�偷偷懒,拿个OC的凑合用吧,记得导入<zlib.h>
  • (uint32_t)CRC32Value
    {
    uLong crc = crc32(0L, Z_NULL, 0);
    crc32(crc, self.bytes, self.length);
    return crc;
    }
*****
Q6.那么,序列化
A: 当我一开始知道,要将一个未知的模型转化成JSON的时候,其实我的心里是拒绝的。OC有MJExtension,Swift有Reflect了,拿来主义不就行了!但是在Framework里导入别人的框架不到万不得已,个人觉得还是不要这么干,原因有三,1.自己把握方法实现,出Bug了好查一点。2.还要做必要的配置工作,3.文件夹在明里会多3个文件。。好吧总结123就是,懒懒懒。
那么,希望你们碰到这样需求的时候不会苦逼的要抽方法,抽模型出来调试:

extension NSObject
{
func getProperty() throws ->[String:Any?]
{
struct getPropertyError: Error
{
var ErrorReason:String

        init(reason:String)
        {
            ErrorReason = reason
        }
    }
    
    var props = [String:Any?]()
    
    var outCount:UInt32 = 0
    
    if let properties = class_copyPropertyList(classForCoder, &outCount)
    {
        for i in 0..<outCount
        {
            if let name = String(cString: property_getName(properties[Int(i)]), encoding: String.Encoding.utf8),let value = value(forKey: name)
            {
                props[name] = value
            }
            else
            {
                //不能允许转换不完全
                throw getPropertyError(reason:"转换失败")
            }
        }
    }
    return props
}

}

*****
Q7. 最后的最后,网络部分。
A: 模型变字典,然后愉快的(~~并不~~)变成了JSON之后,我们要和服务器通讯了。Java�如果用流式传输,就是创建```Stream```对象然后用```read```or```write```方法给服务器传输数据,oh,no!To be frank,不习惯。怎么办?
我们有```URLSession```.

举个POST方法的例子吧。
First:定义一个```URLRequest```,设置

req.httpMethod = "POST"

然后把要上传的数据准备好,这个例子就讲完了。(完结撒花,此处有没有👏不重要)
*****

“Wait,URLSession方法是异步的呀,放在有返回值的方法里,回调还没执行,方法就return啦!”
“......”
 //创建信号量
 let semaphore = DispatchSemaphore(value: 0)  

 URLSession.shared.uploadTask(with: req, from: data, completionHandler: {
        (resData, response, error) in            
        /*do something */

        //�终于等到你 还好我没放弃
        semaphore.signal()
    }).resume()
     
    //如果要给等待加一个期限 我希望是永远  
    _ = semaphore.wait(timeout: DispatchTime.distantFuture)
*****
到这里基本上所有的大坑都踩完了。剩下的整理整理想一想遗漏的再更新啦,谢谢看到这里的人,希望你们喜欢,也希望对你们有帮助。
如果觉得写的入得了各位看官老爷的法眼,请不要吝啬点个赞,Thank u very much!💗
*****
**最后感谢**[@xiaoheng](http://www.jianshu.com/users/bafc9a0f5df2/timeline),[@瑾瑾小泉](http://www.jianshu.com/users/d7ffbe4ce951)两位在闲暇时刻的讨论支持:)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 笑,只是一种表情,而不代表一种心情
    木_槿_阅读 148评论 0 0
  • 导入语:就是的 一切都起源于“吃不到葡萄就说葡萄酸” 罐头视频短短8个月就完成了3轮融资,从天使轮、Pre-A轮之...
    Fiona的世界阅读 263评论 0 0
  • “搅团”是陕西的一道美食 可能没有像肉夹馍,羊肉泡那么闻名 但是真心味道好吃~ 老妈说其他西北五省有的地方也有搅团...
    刘公子说阅读 832评论 1 5