swa*_*ner 14 cocoa-touch json swift
我想发布一个可可触摸框架,其中包含一些json文件,其中包含我不希望framwork的用户看到的逻辑; 不幸的是,在.framework
文件中仍然可以看到json.
我想把它包含在一个快速文件中:
struct JsonProvider {
static let json = "..."
}
Run Code Online (Sandbox Code Playgroud)
但是我的json很大,文件不再可用了.我找不到命令行编译的解决方案然后包含它.
是否有解决这两个问题之一,即
Igo*_*ets -1
您可以将 json 文件内容作为 base64 编码字符串添加到源中。
struct JSONFiles {
internal static let fileOneBase64String = "iVBORw0KGgoAAAANSUhEUgAAAMEAAADLCAYAAADX..."
static var fileOneJSON: [String: Any] {
let data = Data(base64Encoded: fileOneBase64String)!
return try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
}
}
Run Code Online (Sandbox Code Playgroud)
您可以稍后在框架中的任何位置使用它
print(JSONFiles.fileOneJSON)
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助
更新:为什么是base64编码的字符串?
Base64 编码字符串的主要好处 - 您不需要转义 JSON 字符串中包含的特殊符号。在添加到 swift 源文件之前,不需要从 json 字符串中删除新行符号/意图符号。参见示例
let string: String = "{ \"name\":\"John\", \"email\": \"hello@stackoverflow\" \"age\":30, \"car\":null }"
Run Code Online (Sandbox Code Playgroud)
但如果json更复杂呢?如果包含10个嵌套级别、数组、字典?
您可以通过 UnitTests 覆盖其中包含的值fileOneBase64String
可以解码为 JSON 对象
import XCTest
@testable import MyAwesomeFramework
class FrameworkTests: XCTestCase {
func testThatBase64EncodedJSONStringCanBeDecoded() {
let data = Data(base64Encoded: JSONFiles.fileOneBase64String)
XCTAssertNotNil(data, "Unable to convert base64 string to Data")
do {
_ = try JSONSerialization.jsonObject(with: data, options: [])
} catch {
XCTFail("Expected decoded JSON ")
}
}
}
Run Code Online (Sandbox Code Playgroud)