内容 1.1.3

内容 1.1.3

测试已测试
语言语言 SwiftSwift
许可 NOASSERTION
发布最后发布2019年4月
SPM支持SPM

evermeer 维护。



内容 1.1.3

内容

Issues Documentation Stars Downloads

Version Language Platform License

Git Twitter LinkedIn Website eMail

一般信息

内容是一个代码片段集合,这些片段太小,不足以创建库,且不适合放置在其他库中。运行单元测试以查看代码的实际运行情况。

  • 打印 - 用于创建良好的输出日志
  • 枚举 - 向枚举添加功能
  • 待办事项 - 添加待办事项辅助函数
  • 可编码 - 添加可编码辅助函数(Swift 4)

打印

您可以通过在Podfile中添加以下行来安装它:

pod "Stuff/Print"

Stuff.print函数旨在替代标准的.print函数。它会提供关于打印机何时以及在哪里执行的信息。除此之外,还支持不同的日志级别,您还可以指定应该输出的最低日志级别。

以下是一些示例

    Stuff.print("Just as the standard print but now with detailed information")
    Stuff.print("Now it's a warning", .warn)
    Stuff.print("Or even an error", .error)

    Stuff.minimumLogLevel = .error
    Stuff.print("Now you won't see normal log output")
    Stuff.print("Only errors are shown", .error)

    Stuff.minimumLogLevel = .none
    Stuff.print("Or if it's disabled you won't see any log", .error)    

以上代码的输出是

✳️ .debug ⏱ 02/13/2017 09:52:51:852 📱 xctest [18960:?] 📂 PrintStuffTests.swift(15) ⚙️ testExample() ➡️
    Just as the standard print but now with detailed information

⚠️ .warn ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(16) ⚙️ testExample() ➡️
    Now it's a warning

🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(17) ⚙️ testExample() ➡️
    Or even an error

🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(21) ⚙️ testExample() ➡️
    Only errors are shown

还有一个用于错误对象的快速打印语句。这会将本地化描述打印出来,并将警告级别设置到.error。

    Stuff.print(error)

更新:从现在开始打印.error也会给你一个堆栈跟踪。

更新时间:2019年4月4日:现在您也可以将minimumLogLevel设置为productionLogAll。这将确保您也可以在控制台(菜单“窗口”,“设备和模拟器”,“打开控制台”)中看到日志。在大多数情况下,您只有在想要查看使用Testflight分发的应用的日志时才应使用此设置。

枚举

您可以通过在Podfile中添加以下行来安装它:

pod "Stuff/Enum"
  • 获取数组中所有可能的枚举值
  • 获取任何枚举的关联值
  • 将包含关联值的枚举数组转换为字典或查询字符串。
  • 即使枚举是通过any传递的,也能获取枚举的原始值
// You have to extend the enum with the Enum protocol (and RawEnum if you want the raw value when it's an Any)
enum test1: String, Enum, RawEnum {
    case option1
    case option2
    case option3
}

enum test2: Enum {
    case option4(String)
    case option5(Int)
    case option6(Int, String)
}

XCTAssert(test1.allValues.count == 3, "There should be 3 values")
for value in test1.allValues {
    print("value = \(value)")
}

let v1: test2 = .option4("test")
print("v1 = \(v1.associated.label), \(v1.associated.value!)")
let v2: test2 = .option5(3)
print("v2 = \(v2.associated.label), \(v2.associated.value!)")
let v3: test2 = .option6(4, "more")
print("v3 = \(v3.associated.label), \(v3.associated.value!)")

let array = [v1, v2, v3]
let dict = [String:Any](array)
print("Array of enums as dictionary:\n \(dict)")

print("query = \(array.queryString))")

let v = getRawValue(test1.option2)
print("raw value = \(v)")

func getRawValue(_ value: Any) -> Any {
    return (value as? RawEnum)?.anyRawValue ?? ""
}

输出如下

value = option1
value = option2
value = option3
v1 = option4, test
v2 = option5, 3
v3 = option6, (4, "more")
Array of enums as dictionary:
["option5": 3, "option4": "test", "option6": (4, "more")]
query = option4=test,option5=3,option6=(4, "more"))
raw value = option2

待办事项

您可以通过在Podfile中添加以下行来安装它:

pod "Stuff/TODO"

每当您将函数添加到项目中并推迟实现时,您应该添加待办事项。每当您临时更改功能代码进行调试时,您应该添加待办事项。在提交/推送代码之前,您应该评估/解决待办事项。通常,您只需在代码中添加如下待办事项注释即可

    //TODO: This needs to be fixed

使用Stuff/TODO助手,您可以获得编译时和运行时支持,以帮助您找到待办事项。以下是您可以使用的选项概览

    // We need to fix something, but this code can run (compiler warning)
    TODO()

    // Now output extra info when this code is executed.
    TODO("An other todo, now giving some detailed info")

    // We need to fix this. Otherwise just fail. The code will crash here. See the stacktrace,
    TODO_

上面的代码将以下内容放入您的输出。除了这些以外,当您在Xcode中打开代码时,您还将看到已弃用警告。

⚠️ TODO code is still in use! ⚠️

⚠️ TODO code is still in use! ⚠️
An other todo, now giving some detailed info
fatal error: TODO left in code: file /Users/evermeer/Desktop/dev/GitHub/Stuff/Source/TODO/TODO.swift, line 15

但是...添加以下构建阶段脚本可能更好一些,这将提供编译时警告

KEYWORDS="TODO|FIXME|\?\?\?:|\!\!\!:"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | \
perl -p -e "s/($KEYWORDS)/ warning: \$1/"

Codable

您可以通过在Podfile中添加以下行来安装它:

pod "Stuff/Codable"

Swift 4添加了Codable协议(EnCodable和DeCodable),您可以将其添加到类或结构体中。然后Swift编译器将为您的对象添加编码和解码功能。通过使用JSONEncoder和JSONDecoder类,您可以将对象从JSON转换为JSON,或将JSON转换为对象。Stuff Codable扩展可以让您一行代码完成这些操作。以下是从Apple获取的关于《Codable》的文档:Codable。以下是一行代码可用的选项

let json = yourEncodableObjectInstance.toJsonString()
let data = yourEncodableObjectInstance.toJsonData()
let newObject = try? YourCodableObject(json: json)
let newObject2 = try? YourCodableObject(data: data)
let objectArray = try? [YourCodableObject](json: json)
let objectArray2 = try? [YourCodableObject](data: data)
let newJson = objectArray.toJsonString()
let innerObject = try? TestCodable(json: "{\"user\":{\"id\":1,\"naam\":\"Edwin\"}}", keyPath: "user")
try initialObject.saveToDocuments("myFile.dat")
let readObject = try? TestCodable(fileNameInDocuments: "myFile.dat")
try objectArray.saveToDocuments("myFile2.dat")
let objectArray3 = try? [TestCodable](fileNameInDocuments: "myFile2.dat")

下面你可以看到如何使用这些Stuff/Codable函数

func test() {
   let initialObject = TestCodable(naam: "Edwin", id: 1, testField: "tst")

   guard let json = initialObject.toJsonString() else {
      print("Could not create json from object")
      return
   }
   print("Json string of object = \n\t\(json)")

   guard let newObject = try? TestCodable(json: json) else {
      print("Could not create object from json")
      return
   }
   print("Object created with json = \n\t\(newObject)")
   
   let json2 = "[{\"id\":1,\"naam\":\"Edwin\"},{\"id\":2,\"naam\":\"Vermeer\"}]"
   guard let array = try? [TestCodable](jsonArray: json2) else {
      print("Could not create object array from json")
      return
   }
   print("Object array created with json = \(array)")
   
   let newJson = array.toJsonString()
   print("Json from object array = \n\t\(newJson)")
   
   guard let innerObject = try? TestCodable(json: "{\"user\":{\"id\":1,\"naam\":\"Edwin\"}}", keyPath: "user") else {
      print("Could not create object from json")
      return
   }
   print("inner object from json \(String(describing: innerObject))")
   
   guard let custom = try TestCodable(json: "{\"Naam\":\"UpperN\", \"Id\":5, \"Test_field\":\"lowerSnake\"}", keyPath: nil, codingStrategy: customCodingStragegy) else {
      print("Could not custom case convert")
      return
   }
   print("read object with custom key coding from json to \(String(describing:    
}

struct TestCodable : Codable {
   var naam: String?
   var id: Int?
    var testField: String?    
}

除了上面的示例代码中显示的keyPath参数之外,您还可以添加一个或多个标准JSONDecoder中的以下参数。如果未提供这些参数,则将使用默认值(=后面的值)。

keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .convertFromSnakeCase,
dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .deferredToDate,
dataDecodingStrategy: JSONDecoder.DataDecodingStrategy = .base64,
nonConformingFloatDecodingStrategy: JSONDecoder.NonConformingFloatDecodingStrategy = .throw

许可证

内容受MIT 3许可证许可。更多详细信息请参阅LICENSE文件。

我的其他库

另请参阅我的其他公开源iOS库

  • EVReflection - 基于反射的对象映射(字典、CKRecord、JSON和XML)与对于Alamofire和Moya的扩展,支持RxSwift或ReactiveSwift
  • EVCloudKitDao - 简化访问苹果的CloudKit
  • EVFaceTracker - 计算您的设备相对于您脸部的距离和角度,以模拟3D效果
  • EVURLCache - 处理使用NSURLRequest的所有Web请求的NSURLCache子类
  • AlamofireOauth2 - 使用Alamofire实现的OAuth2
  • EVWordPressAPI - 使用AlamofireOauth2、EVReflection和Alamofire实现的WordPress(Jetpack)API(进行中)
  • PassportScanner - 扫描护照的MRZ代码并提取名、姓、护照号码、国籍、出生日期、过期日期和个人编号。
  • AttributedTextView - 创建具有多个链接(URL、井号、提及)支持的格式化UITextView的最简单方式
  • UITestHelper - UI测试辅助函数。