关于最详尽的Swift代码规范指南和swift代码规则的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于#翻译#Google的Objective-C代码规范指南、AWESOMESWIFT-s
关于最详尽的 Swift 代码规范指南 和swift代码规则 的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于#翻译# Google 的 Objective-C 代码规范指南、AWESOME SWIFT-swift.libhunt.com-swift类库网站、Chris Lattner 对 Swift 3 的总结与对 Swift 4 的展望、Emoji 上的 Swift:换一种视角来理解 Swift 高阶函数 等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:
最详尽的 Swift 代码规范指南(swift代码规则)
1. 代码格式
1.1 使用四个空格进行缩进。
1.2 每行最多160个字符,这样可以避免一行过长。 (Xcode->Preferences->Text Editing->Page guide at column: 设置成160即可)
1.3 确保每个文件结尾都有空白行。
1.4 确保每行都不以空白字符作为结尾 (Xcode->Preferences->Text Editing->Automatically trim trailing whitespace + Including whitespace-only lines).
1.5 左大括号不用另起一行。
1
2
3
4
5
6
7
8
9
10
11
12
class SomeClass {
func someMethod() {
if
x == y {
/* ... */
}
else
x == z {
/* ... */
else
{
/* ... */
}
}
/* ... */
}
1.6 当在写一个变量类型,一个字典里的主键,一个函数的参数,遵从一个协议,或一个父类,不用在分号前添加空格。
12
13
14
15
16
17
18
19
20
21
// 指定类型
let pirateViewController: PirateViewController
// 字典语法(注意这里是向左对齐而不是分号对齐)
let ninjaDictionary: [String: AnyObject] = [
"fightLikeDairyFarmer"
:
false
,
"disgusting"
true
]
// 声明函数
func myFunction<t, u: someprotocol where t.relatedtype == u>(firstArgument: U, secondArgument: T) {
/* ... */
}
// 调用函数
someFunction(someArgument:
"Kitten"
)
// 父类
class PirateViewController: UIViewController {
/* ... */
}
// 协议
extension PirateViewController: UITableViewDataSource {
/* ... */
}</t, u: someprotocol where t.relatedtype == u>
1.7 基本来说,要在逗号后面加空格。
1
let myArray = [1, 2, 3, 4, 5]
1.8 二元运算符(+,==,或->)的前后都需要添加空格,左小括号后面和右小括号前面不需要空格。
7
let myValue = 20 + (30 / 2) * 3
1 + 1 == 3 {
fatalError(
"The universe is broken."
)
}
func pancake() -> Pancake {
/* ... */
1.9 遵守Xcode内置的缩进格式( 如果已经遵守,按下CTRL-i 组合键文件格式没有变化)。当声明的一个函数需要跨多行时,推荐使用Xcode默认的格式,目前Xcode 版本是 7.3。
13
// Xcode针对跨多行函数声明缩进
func myFunctionWithManyParameters(parameterOne: String,
parameterTwo: String,
parameterThree: String) {
// Xcode会自动缩进
print(
"\(parameterOne) \(parameterTwo) \(parameterThree)"
)
}
// Xcode针对多行 if 语句的缩进
myFirstvariable > (mySecondVariable + myThirdVariable)
&& myFourthVariable == .someEnumValue {
// Xcode会自动缩进
"Hello, World!"
)
1.10 当调用的函数有多个参数时,每一个参数另起一行,并比函数名多一个缩进。
4
someFunctionWithManyArguments(
firstArgument:
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, I am a string"
secondArgument: resultFromSomeFunction()
thirdArgument: someOtherLocalVariable)
1.11 当遇到需要处理的数组或字典内容较多需要多行显示时,需把 [ 和 ] 类似于方法体里的括号, 方法体里的闭包也要做类似处理。
someFunctionWithABunchOfArguments(
someStringArgument:
"hello I am a string"
someArrayArgument: [
"dadada daaaa daaaa dadada daaaa daaaa dadada daaaa daaaa"
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"string one is crazy - what is it thinking?"
],
someDictionaryArgument: [
"dictionary key 1"
:
"some value 1, but also some more text here"
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"dictionary key 2"
"some value 2"
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
someClosure: { parameter1
in
print(parameter1)
})
1.12 应尽量避免出现多行断言,可使用本地变量或其他策略。
// 推荐
let firstCondition = x == firstReallyReallyLongPredicateFunction()
let secondCondition = y == secondReallyReallyLongPredicateFunction()
let thirdCondition = z == thirdReallyReallyLongPredicateFunction()
firstCondition && secondCondition && thirdCondition {
// 你要干什么
// 不推荐
x == firstReallyReallyLongPredicateFunction()
&& y == secondReallyReallyLongPredicateFunction()
&& z == thirdReallyReallyLongPredicateFunction() {
// 你要干什么
2. 命名
2.1 在Swift中不用如Objective-C式 一样添加前缀 (如使用 GuybrushThreepwoode 而不是 LIGuybrushThreepwood)。
2.2 使用帕斯卡拼写法(又名大骆驼拼写法,首字母大写)为类型命名 (如 struct,enum,class,typedef,associatedtype 等)。
2.3 使用小骆驼拼写法 (首字母小写) 为函数,方法,变量,常量,参数等命名。
2.4 首字母缩略词在命名中一般来说都是全部大写,例外的情形是如果首字母缩略词是一个命名的开始部分,而这个命名需要小写字母作为开头,这种情形下首字母缩略词全部小写。
8
// "HTML" 是变量名的开头, 需要全部小写 "html"
let htmlBodyContent: String =
"<p>Hello, World!</p>"
// 推荐使用 ID 而不是 Id
let profileID: Int = 1
// 推荐使用 URLFinder 而不是 UrlFinder
class URLFinder {
/* ... */
2.5 使用前缀 k + 大骆驼命名法 为所有非单例的静态常量命名。
9
class MyClassName {
// 基元常量使用 k 作为前缀
static let kSomeConstantHeight: CGFloat = 80.0
// 非基元常量也是用 k 作为前缀
static let kDeleteButtonColor = UIColor.redColor()
// 对于单例不要使用k作为前缀
static let sharedInstance = MyClassName()
/* ... */
2.6 对于泛型和关联类型,可以使用单个大写字母,也可是遵从大骆驼命名方式并能描述泛型的单词。如果这个单词和要实现的协议或继承的父类有冲突,可以为相关类型或泛型名字添加 Type 作为后缀。
class SomeClass<t> {
/* ... */
}
class SomeClass<model> {
}
protocol Modelable {
associatedtype Model
}
protocol Sequence {
associatedtype IteratorType: Iterator
}</model></t>
2.7 命名应该具有描述性 和 清晰的。
class RoundAnimatingButton: UIButton {
}
// 不推荐
class CustomButton: UIButton {
2.8 不要缩写,简写命名,或用单个字母命名。
14
class RoundAnimatingButton: UIButton {
let animationDuration: NSTimeInterval
func startAnimating() {
let firstSubview = subviews.first
}
// 不推荐
class RoundAnimating: UIButton {
let aniDur: NSTimeInterval
func srtAnmating() {
let v = subviews.first
}
2.9 如果原有命名不能明显表明类型,则属性命名内要包括类型信息。
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class ConnectionTableViewCell: UITableViewCell {
let personImageView: UIImageView
let animationDuration: NSTimeInterval
// 作为属性名的firstName,很明显是字符串类型,所以不用在命名里不用包含String
let firstName: String
// 虽然不推荐, 这里用 Controller 代替 ViewController 也可以。
let popupController: UIViewController
let popupViewController: UIViewController
// 如果需要使用UIViewController的子类,如TableViewController, CollectionViewController, SplitViewController, 等,需要在命名里标名类型。
let popupTableViewController: UITableViewController
// 当使用outlets时, 确保命名中标注类型。
@IBOutlet weak
var
submitButton: UIButton!
emailTextField: UITextField!
nameLabel: UILabel!
}
// 不推荐
class ConnectionTableViewCell: UITableViewCell {
// 这个不是 UIImage, 不应该以Image 为结尾命名。
// 建议使用 personImageView
let personImage: UIImageView
// 这个不是String,应该命名为 textLabel
let text: UILabel
// animation 不能清晰表达出时间间隔
// 建议使用 animationDuration 或 animationTimeInterval
let animation: NSTimeInterval
// transition 不能清晰表达出是String
// 建议使用 transitionText 或 transitionString
let transition: String
// 这个是ViewController,不是View
let popupView: UIViewController
// 由于不建议使用缩写,这里建议使用 ViewController替换 VC
let popupVC: UIViewController
// 技术上讲这个变量是 UIViewController, 但应该表达出这个变量是TableViewController
let popupViewController: UITableViewController
// 为了保持一致性,建议把类型放到变量的结尾,而不是开始,如submitButton
btnSubmit: UIButton!
buttonSubmit: UIButton!
// 在使用outlets 时,变量名内应包含类型名。
// 这里建议使用 firstNameLabel
firstName: UILabel!
2.10 当给函数参数命名时,要确保函数能理解每个参数的目的。
2.11 根据苹果接口设计指导文档,如果协议描述的是协议做的事应该命名为名词(如Collection) ,如果描述的是行为,需添加后缀 able 或 ing (如Equatable 和 ProgressReporting)。 如果上述两者都不能满足需求,可以添加Protocol作为后缀,例子见下面。
17
// 这个协议描述的是协议能做的事,应该命名为名词。
protocol TableViewSectionProvider {
func rowHeight(atRow row: Int) -> CGFloat
numberOfRows: Int { get }
/* ... */
}
// 这个协议表达的是行为, 以able最为后缀
protocol Loggable {
func logCurrentState()
// 因为已经定义类InputTextView,如果依然需要定义相关协议,可以添加Protocol作为后缀。
protocol InputTextViewProtocol {
func sendTrackingEvent()
func inputText() -> String
3. 代码风格
3.1 综合
3.1.1 尽可能的多使用let,少使用var。
3.1.2 当需要遍历一个集合并变形成另一个集合时,推荐使用函数 map,filter 和 reduce。
18
let stringOfInts = [1, 3].flatMap { String($0) }
// ["1", "2", "3"]
// 不推荐
stringOfInts: [String] = []
for
integer
in
[1, 3] {
stringOfInts.append(String(integer))
}
// 推荐
let evennumbers = [4, 8, 15, 16, 23, 42].filter { $0 % 2 == 0 }
// [4, 42]
// 不推荐
evennumbers: [Int] = []
[4, 42] {
integer % 2 == 0 {
evennumbers(integer)
}
3.1.3 如果变量类型可以依靠推断得出,不建议声明变量时指明类型。
3.1.4 如果一个函数有多个返回值,推荐使用 元组 而不是 inout 参数, 如果你见到一个元组多次,建议使用typealias ,而如果返回的元组有三个或多于三个以上的元素,建议使用结构体或类。
6
func pirateName() -> (firstName: String, lastName: String) {
return
(
"Guybrush"
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"Threepwood"
)
}
let name = pirateName()
let firstName = name.firstName
let lastName = name.lastName
3.1.5 当使用委托和协议时,请注意避免出现循环引用,基本上是在定义属性的时候使用 weak 修饰。
3.1.6 在闭包里使用 self 的时候要注意出现循环引用,使用捕获列表可以避免这一点。
myFunctionWithClosure() { [weak self] (error) -> Void
in
// 方案 1
self?.doSomething()
// 或方案 2
guard let strongSelf = self
{
return
}
strongSelf.doSomething()
3.1.7 Switch 模块中不用显式使用break。
3.1.8 断言流程控制的时候不要使用小括号。
// 推荐
x == y {
/* ... */
}
// 不推荐
(x == y) {
imageView.setimageWithURL(url, type: .person)
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, type: AsyncImageView.Type.person)
3.1.10 在使用类方法的时候不用简写,因为类方法不如 枚举 类型一样,可以根据轻易地推导出上下文。
imageView.backgroundColor = UIColor.whiteColor()
imageView.backgroundColor = .whiteColor()
3.1.11 不建议使用用self.修饰除非需要。
3.1.12 在新写一个方法的时候,需要衡量这个方法是否将来会被重写,如果不是,请用 final 关键词修饰,这样阻止方法被重写。一般来说,final 方法可以优化编译速度,在合适的时候可以大胆使用它。但需要注意的是,在一个公开发布的代码库中使用 final 和本地项目中使用 final 的影响差别很大的。
3.1.13 在使用一些语句如 else,catch等紧随代码块的关键词的时候,确保代码块和关键词在同一行。下面 if/else 和 do/catch 的例子.
10
someBoolean {
// 你想要什么
{
// 你不想做什么
}
do
{
let fileContents =
try
readFile(
"filename.txt"
)
catch
{
print(error)
3.2 访问控制修饰符
3.2.1 如果需要把访问修饰符放到第一个位置。
private static let kMyPrivateNumber: Int
static private let kMyPrivateNumber: Int
3.2.2 访问修饰符不应单独另起一行,应和访问修饰符描述的对象保持在同一行。
public class Pirate {
// 不推荐
public
class Pirate {
3.2.3 默认的访问控制修饰符是 internal,如果需要使用internal 可以省略不写。
3.2.4 当一个变量需要被单元测试 访问时,需要声明为 internal 类型来使用@testable import {ModuleName}。 如果一个变量实际上是private 类型,而因为单元测试需要被声明为 internal 类型,确定添加合适的注释文档来解释为什么这么做。这里添加注释推荐使用 - warning: 标记语法。
5
/**
这个变量是private 名字
- warning: 定义为 internal 而不是 private 为了 `@testable`.
*/
let pirateName =
"LeChuck"
3.3 自定义操作符
不推荐使用自定义操作符,如果需要创建函数来替代。
在重写操作符之前,请慎重考虑是否有充分的理由一定要在全局范围内创建新的操作符,而不是使用其他策略。
你可以重载现有的操作符来支持新的类型(特别是 ==),但是新定义的必须保留操作符的原来含义,比如 == 必须用来测试是否相等并返回布尔值。
3.4 Switch 语句 和 枚举
3.4.1 在使用 Switch 语句时,如果选项是有限集合时,不要使用default,相反地,把一些不用的选项放到底部,并用 break 关键词 阻止其执行。
3.4.2 因为Swift 中的 switch 选项默认是包含break的, 如果不需要不用使用 break 关键词。
3.4.3 case 语句 应和 switch 语句左对齐,并在 标准的 default 上面。
3.4.4 当定义的选项有关联值时,确保关联值有恰当的名称,而不只是类型。(如. 使用 case Hunger(hungerLevel: Int) 而不是 case Hunger(Int)).
15
enum Problem {
case
attitude
hair
hunger(hungerLevel: Int)
func handleProblem(problem: Problem) {
switch
problem {
.attitude:
"At least I don''t have a hair problem."
)
.hair:
"Your barber didn''t kNow when to stop."
)
.hunger(let hungerLevel):
"The hunger level is \(hungerLevel)."
)
}
3.4.5 推荐尽可能使用fall through。
3.4.6 如果default 的选项不应该触发,可以抛出错误 或 断言类似的做法。
func handleDigit(digit: Int) throws {
0, 1, 5, 6, 7, 9:
"Yes, \(digit) is a digit!"
)
default
:
throw
Error(message:
"The given number was not a digit."
)
3.5 可选类型
3.5.1 唯一使用隐式拆包可选型(implicitly unwrapped optionals)的场景是结合@IBOutlets,在其他场景使用 非可选类型 和 常规可选类型,即使有的场景你确定有的变量使用的时候永远不会为 nil, 但这样做可以保持一致性和程序更加健壮。
3.5.2 不要使用 as! 或 try!。
3.5.3 如果对于一个变量你不打算声明为可选类型,但当需要检查变量值是否为 nil,推荐用当前值和 nil 直接比较,而不推荐使用 if let 语法。
someOptional != nil {
// 你要做什么
let _ = someOptional {
// 你要做什么
3.5.4 不要使用 uNowned,uNowned 和 weak 变量基本上等价,并且都是隐式拆包( uNowned 在引用计数上有少许性能优化),由于不推荐使用隐式拆包,也不推荐使用uNowned 变量。
weak
parentViewController: UIViewController?
parentViewController: UIViewController!
uNowned
parentViewController: UIViewController
3.5.5 当拆包取值时,使用和被拆包取值变量相同的名称。
guard let myVariable = myVariable
return
3.6 协议
在实现协议的时候,有两种方式来组织你的代码:
使用 // MARK: 注释来分割协议实现和其他代码。
使用 extension 在 类/结构体已有代码外,但在同一个文件内。
请注意 extension 内的代码不能被子类重写,这也意味着测试很难进行。 如果这是经常发生的情况,为了代码一致性最好统一使用第一种办法。否则使用第二种办法,其可以代码分割更清晰。
使用而第二种方法的时候,使用 // MARK: 依然可以让代码在 Xcode 可读性更强。
3.7 属性
3.7.1 对于只读属性,计算后(Computed)属性,提供 getter 而不是 get {}。
computedProperty: String {
someBool {
return
"I''m a mighty pirate!"
}
"I''m selling these fine leather jackets."
3.7.2 对于属性相关方法 get {},set {},willSet,和 didSet,确保缩进相关代码块。
3.7.3 对于willSet/didSet 和 set 中的旧值和新值虽然可以自定义名称,但推荐使用默认标准名称 newValue/oldValue。
get {
someBool {
"I''m a mighty pirate!"
}
"I''m selling these fine leather jackets."
set {
computedProperty = newValue
willSet {
"will set to \(newValue)"
)
}
didSet {
"did set from \(oldValue) to \(newValue)"
)
}
3.7.4 在创建类常量的时候,使用 static 关键词修饰。
class MyTableViewCell: UITableViewCell {
static let kReuseIdentifier = String(MyTableViewCell)
static let kCellHeight: CGFloat = 80.0
class PirateManager {
static let sharedInstance = PirateManager()
3.8 闭包
3.8.1 如果参数的类型很明显,可以在函数名里可以省略参数类型,但明确声明类型也是允许的。 代码的可读性有时候是添加详细的信息,而有时候部分重复,根据你的判断力做出选择吧,但前后要保持一致性。
// 省略类型
doSomethingWithClosure() { response
in
print(response)
// 明确指出类型
doSomethingWithClosure() { response: NSURLResponse
in
print(response)
// map 语句使用简写
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, 3].flatMap { String($0) }
3.8.2 如果使用捕捉列表 或 有具体的非 Void返回类型,参数列表应该在小括号内, 否则小括号可以省略。
// 因为使用捕捉列表,小括号不能省略。
doSomethingWithClosure() { [weak self] (response: NSURLResponse)
self?.handleResponse(response)
// 因为返回类型,小括号不能省略。
doSomethingWithClosure() { (response: NSURLResponse) -> String
String(response)
3.8.3 如果闭包是变量类型,不需把变量值放在括号中,除非需要,如变量类型是可选类型(Optional?), 或当前闭包在另一个闭包内。确保闭包里的所以参数放在小括号中,这样()表示没有参数,Void 表示不需要返回值。
let completionBlock: (success: Bool) -> Void = {
"Success? \(success)"
let completionBlock: () -> Void = {
"Completed!"
let completionBlock: (() -> Void)? = nil
3.9 数组
3.9.1 基本上不要通过下标直接访问数组内容,如果可能使用如 .first 或 .last,因为这些方法是非强制类型并不会崩溃。 推荐尽可能使用 for item in items 而不是 for i in 0..<items.count 遍历数组。="" 如果需要通过下标访问数组内容,在使用前要做边界检查。<="" p="">
3.9.2 不要使用 += 或 + 操作符给数组添加新元素,使用性能较好的.append() 或.appendContentsOf() ,如果需要声明数组基于其他的数组并保持不可变类型, 使用 let myNewArray = [arr1,arr2].flatten(),而不是let myNewArray = arr1 + arr2 。
3.10 错误处理
假设一个函数 myFunction 返回类型声明为 String,但是总有可能函数会遇到error,有一种解决方案是返回类型声明为 String?,当遇到错误的时候返回 nil。
例子:
16
func readFile(withFilename filename: String) -> String? {
guard let file = openFile(filename)
{
nil
let fileContents = file.read()
file.close()
fileContents
}
func printSomeFile() {
let filename =
"somefile.txt"
guard let fileContents = readFile(filename)
{
"不能打开 \(filename)."
return
}
print(fileContents)
实际上如果预知失败的原因,我们应该使用Swift 中的 try/catch 。
定义 错误对象 结构体如下:
12
struct Error: ErrorType {
public let file: StaticString
public let
function
: StaticString
public let line: UInt
public let message: String
public init(message: String, file: StaticString =
#file, function: StaticString = #function, line: UInt = #line) {
self.file = file
self.
function
=
function
self.line = line
self.message = message
}
使用案例:
func readFile(withFilename filename: String) throws -> String {
Error(message: “打不开的文件名称 \(filename).")
{
readFile(filename)
print(fileContents)
{
print(error)
}
其实项目中还是有一些场景更适合声明为可选类型,而不是错误捕捉和处理,比如在获取远端数据过程中遇到错误,nil作为返回结果是合理的,也就是声明返回可选类型比错误处理更合理。
整体上说,如果一个方法有可能失败,并且使用可选类型作为返回类型会导致错误原因湮没,不妨考虑抛出错误而不是吃掉它。
3.11 使用 guard 语句
3.11.1 总体上,我们推荐使用提前返回的策略,而不是 if 语句的嵌套。使用 guard 语句可以改善代码的可读性。
3
总结
以上是小编为你收集整理的最详尽的 Swift 代码规范指南全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Swift相关文章
效率成吨提升之代码生成器-蓝湖工具神器iOS,Android,Swift,Flutter
软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
【Audio音频开发】音频基础知识及PCM技术详解
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
自定义ava数据集及训练与测试 完整版 时空动作/行为 视频数据集制作 yolov5, deep sort, VIA MMAction, SlowFast
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
零基础用Android Studio实现简单的本地视频播放器
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
热门文章
• 效率成吨提升之代码生成器-蓝湖工具神器 • 【Audio音频开发】音频基础知识及PCM技 • 见过仙女蹦迪吗?一起用python做个小仙 • 【Android App】实战项目之仿抖音的短视 • 自定义ava数据集及训练与测试 完整版 时 • 【视频+源码】登录鉴权的三种方式:tok • 【Android App】实战项目之仿微信的私信 • 零基础用Android Studio实现简单的本地 • 采用MATLAB对正弦信号,语音信号进行生 • Keras深度学习实战(40)——音频生成
热门标签更多
Flutterandroidiosswift抖音cocos2d小米cocos2dx三国杀kotlin-coroppococosandroid-jexcodeandroid-liaugmented-美好mutateandroid-gr加到arkitreact-naticnnandroid-cocrashlytic耳机java-nativexoplayerstockandroid-ar壁纸react-natiandroid-daandroid-wowatchosandroid-ca笔记本电脑buildozer装备android-al
#翻译# Google 的 Objective-C 代码规范指南 Objective-C是一种很动态的、面向对象的C语言扩展。它被设计成易用易读,同时支持复杂的面向对象设计。它是Mac OS X和iPhone上开发新应用的主要开发语言
Cocoa是在Mac OS X平台上的一个主要的应用框架。这是一个提供给全功能Mac OS X应用程序的快速开发的Objective-C类集合。
https://swift.libhunt.com/categories/688-events
29 Events libraries and projects
ORDERED BY POPULARITY
ORDER BY DEV ACTIVITY
ReactiveCocoa
ReactiveCocoa (RAC) is a Cocoa framework inspired by Functional Reactive Programming. It provides APIs for composing and transforming streams of values over time.
RxSwift
Microsoft Reactive Extensions (Rx) for Swift and iOS/OSX platform.
PromiseKit
async promise programming lib.
ReSwift
Unidirectional Data Flow in Swift
Bond
a Swift binding framework.
BrightFutures
promise and future lib for swift.
Katana
Swift apps a la React and Redux.
ReactorKit
A framework for reactive and unidirectional application architecture.
ReactKit
Swift Reactive Programming.
FutureKit
A Swift based Future/Promises Library.
SwiftEventBus
A publish/subscribe event bus optimized for iOS.
EmitterKit
an implementation of event emitters and listeners in swift.
Signals
replaces delegates and notifications.
Safe
A modern concurrency and synchronization for Swift.
snail
An observables framework for Swift
Reactor
Powering your RAC architecture.
VueFlux
Unidirectional Data Flow State Management Architecture
SignalKit
Swift event and binding framework.
Observable
The easiest way to observe values.
When
A lightweight implementation of Promises in Swift.
Caravel
A Swift event bus for UIWebView and JS.
Future
A micro framework providing Future.
NoticeObserveKit
NoticeObserveKit is type-safe NotificationCenter wrapper that associates notice type with info type.
Aftermath
Stateless message-driven micro-framework in Swift.
Notificationz
Helping you own NSNotificationCenter by providing a simple, customizable adapter.
Forbind
Functional chaining and Promises in Swift.
ReduxSwift
Predictable state container for Swift apps too
PureFutures
Futures and Promises library.
SSEventFlow
A type safe alternative to NSNotification, inspired by Flux.
Chris Lattner 对 Swift 3 的总结与对 Swift 4 的展望
Chris Lattner 写了一篇文章:回顾 Swift 3,展望 Switf 4,以下是这篇文章的关键内容:
开源大有益处,但无法让所有人满意。
Swift 3 将在 2016 年秋到来。Swift 3.x 会在 2017 年春公布,Swift 4 会在 2017 年秋发布,这其中不包括修复 bug、提升兼容性之类的小更新(例如 3.0.1)。
Swift 4 在交付时一定会保障代码的稳定性,增加容错性、ABI,优化泛型与字符串等等。
语法糖的优先级最低,没有提上日程。
安排进度有些困难。开发的目标并非是对交付的保证。从一开始安排计划与进度就是最主要的事。
下面是全文:
大家好呀,
Swift 3 的正式版已经基本完成,是时候让我们回顾一下这个版本了,从开发过程中汲取经验,并用于总结我们(Swift 社区)在这一年内所做的事。总体上来说,Swift 3 毫无疑问将是一个 amazing 的版本,我们完成了很多出色的工作。感谢所有为它付出的人。相比于立刻着手推进新计划,盘点过去、展望未来同样重要。
提示:这封 email 长得吓人,其中涵盖了各方面的话题。比起直接回复,更好的选择是开一个新话题来讨论。只需在主题上标记“[Swift 4]”即可。
Swift 3 回顾
每年 Swift 的新版本都与前一年完全不同,我希望 Swift 4 能继续保留这个传统。为了每一年都有提升与进步,以下是一些对 Swift 3 的回顾与建议:
开源有许多好处。 见证一个充满活力的团队合作得如此之好,大家几乎彻夜为其付出,让人不可思议、充满惊喜。与这样一个才华横溢并充满热情的团队合作,实在是太棒了!
开源也带来挑战。 比起“闭源设计”,“开源设计” 进度更慢且更加不可预料,我想这么说应该是公允的。然而,开源的结果明显更好,因此权衡之下开源是值得的。“感谢你们”,献给所有帮助 Swift 发展进化的人。
预估 软件开发的进度 (特别是开源项目)依然困难到近乎不可能。我们在着手开发 Swift 3 的时候设立了许多高目标,在后期不得不进行修整。设立一些高目标是好事,但我们需要在沟通上更努力,让其他人知道“目标”不等于“承诺”,避免误导他们。
整个社区得益于在有限的主题上保持专注 ,因为如果有太多事项同时进行,没有人可以持续跟进所有部分。参与到前面所提的关键讨论中,对核心团队而言非常重要。在 Swift 3 的开发周期中,很多人在代码评审结束前都没有时间来跟进讨论,这是一个问题。
确立清晰的目标是一种解脱。 特别是在去年十二月到今年一月,我们大致圈出了那些适合放入 Swift 3 的点子,同时开启了几个项目,这些项目最后远超出我们的能力范围。在后来的版本中,我们确立了几个具体目标(比如“不再加入新计划”),使所有人能更轻松地关注重要事项。
皆大欢喜是不可能的, 尤其是在我们讨论优先开发哪些功能时,因为这会降低其他一些功能的优先级。这是一个无解的局面,因为我们并没有办法将所有有意思的工作都放在一个只有一年长的开发周期中。幸运的是,将来“总会有下一个版本”,每一个新版本都会加入一些重大的改进。
在上述回顾的基础上,我们来展望未来!
Swift 发布计划
在接下来一年里,核心团队预计会发布两个主要的版本:2017 年春发布 Swift 3.x,2017 年秋发布 Swift 4。除了主要版本之外,我们也会发布一些小的更新(如 Swift 3.0.1)来修复 Bug,或满足核心库的需求,或其他的 swift.org 的项目。
Swift 4 发布计划
从我们在 Swift 3 中获得的经验来看,我们需要挑出一些重点。对 Swift 4 来说,主要目标是从 3.0 开始要保证交付的代码的稳定性,并为标准库提供 ABI 的稳定性。因此,核心团队决定在接下来的一年中实施两个阶段的计划:
第一阶段: 专注于提升代码及 ABI 稳定性,全心投入只完成这项必要的工作。这意味着如果一些功能不会从根本上改变现有语言特性的 ABI ,或是对标准库的 ABI 进行了破坏性的改动,那么现阶段都不会考虑开发它们。举个例子,泛型中的条件一致性(Conditional conformances)是一个附加特性,但由于它会对标准库造成众多更改,我们在第一阶段就要实现它。另一方面,正则表达式不会对现有 ABI 造成影响,也不会给标准库带来大量改动,所以第一阶段不会考虑它。
第一阶段的工作非常重要(下面会详细介绍),所以春季之前我们大概一直会很忙。
第二阶段: 当第一阶段功能的设计与实现工作较好得完成之后,我们将基于剩余时间,选择一些大型的功能进行开发。我乐观估计将有剩余时间,来从长长的功能列表中选几个来开发,但具体选哪几个,得看最后剩多少时间。
除了新功能之外,我们也需要重新评估那些在 Swift 3 中尚未实现的、对代码造成破坏性变动的提案。这些提案不一定会被通过,我们需要在 Swift 4 的基础上来评估它们,挨个决定如何处理。
最后,虽然与 Swift 的进步没有特别大的关系,但我想提一提质量与性能问题。核心团队想要进一步提升质量,包括修复编译器的 Bug、改进错误与警告检测功能。性能是开发中另一个需要重视的部分,包括提升编译后的代码质量,改善标准库的实现,加快编译速度等。这些工作在任何开发阶段都需要重视。
Swift 4 第一阶段目标
为了专注于代码与 ABI 的稳定性,核心团队对第一阶段的工作有一个初步的讨论。下面是我们对第一阶段功能排序后的结果:
代码稳定性相关功能 :这一部分工作量相对较小,但很重要。举个例子,我们需要类似于“-std=swift3”的编译器标志。我们也需要一个新方法来开启一些大型的功能,这些功能尚在开发,并不稳定,有了这个方法,调试会更简单。
适应力(Resilience) :这个功能提供了一种方式,在保证 ABI 稳定性同时,公有 API 可以随时间改进。一个例子,我们不想让 C++ 的“fragile base class” 问题发生在 Swift 中。更多设计与实现上的工作已经在 Swift 3 中完成了,但仍有重要工作未完成,包括模型中用户可见的部分(例如新的属性)。
ABI 细节 :代码生成模型中仍有大量细节需要审核与改进。这一部分与 Swift 开发更相关,与 Swift 的演进关系不大。
泛型改进需要在标准库的基础上进行 :我希望条件一致性能在功能清单中处在最高位置,递归协议要求(recursive protocol requirements)与更强大的关联类型约束能处在随后的相近位置。然而,标准库的开发者们需要大量时间来解析出至关重要的部分,最终消除那些“_”协议,并正确展现标准库中的公有 API。
字符串相关改进 :字符串是 Swift 中最重要的基本类型之一。标准库的开发者有很多点子,能改进它的编程范式而不影响到提供 unicode-correct-by-default 范式。我们的目标是在字符串处理上比 Perl 做得更好!
内存所有权模型(Memory ownership model) :许多系统开发者,以及想要可预测及确定性的性能(如在实时音频处理中)的人们,都非常希望 Swift 中能有一个(可选的)类似于 Cyclone / Rust 的内存所有权模型。从 Swift 4 的目标上来说,这个功能很重要,因为它从根本上改变了 ABI。这一模型会通知编译器“inout”事件的产生,解释底层“addressors”如何在 ABI 中运作,影响 Swift runtime,并对类型系统及命名管理产生显著影响。
我们对上面这些功能都有了一些想法,但它们在正式成为提案之前仍有很长路要走。我期待它们会在 Swift 4 的早期成为主要讨论内容。不仅如此,由于我们还没有全部找出那些影响 ABI 稳定性的部分,可能还有其他需要增加的条件。最后,我们也可能选择其他一些对 SwiftPM 这个包管理器,或其他对 swift.org 有高价值的小功能。
可能的 Swift 4 第二阶段工作
如我之前所提到的,在这个点上不可能知道还有多少时间留给第二阶段,因此也不知道第二阶段能完成哪些工作。核心团队也希望比 Swift 3 更早完成 Swift 4 开发版的合流,以便在版本发布之前有更多时间修复 BUG,仔细斟酌。
也就是说,我乐观估计我们能够挑一些大家都想要的新功能来开发。为了让你对这些功能有个概念,我列了张表。请注意这并不是开发的计划或承诺 ,而只是列了一些大家都希望有的功能:
反射 :核心团队正致力于为 Swift 添加强大的动态机制。举个例子,Swift 3 中大致完成了数据反射的基础结构(已被用在 Xcode 的 memory debugger 中)。我们应在这些基础结构之上,搭建一些强大的面向用户的 API。同样,我们想要设计并实现动态方法反射的 runtime 与 API 支持。
最重要的并发 :Actors、异步 / 等待(async / await)、atomicity、内存模型(memory model)以及相关话题。这些是大家都想要的,因为有了它们,就可以在客户端、服务端等之上开发更多新功能。我们计划在第二阶段正式讨论这件事,但非常明确地告诉大家,新的并发模型在 Swift 4 发布时还无法完成。我们需要超过一年的时间来进行设计与开发,我们也希望把这件事做好做对。需要这么多时间,也是因为在开发内存所有权模型之前能更深入的理解它。
泛型改进 :泛型的开发计划中包含来许多激动人心的功能,能改进现有泛型系统。在提升标准库的 ABI 稳定性时并不需要这些功能,但它们会使 Swift 的泛型更加强大易懂。
.swiftmodule 的稳定性 :在某些方面我们需要使“.swiftmodule”的二进制文件格式稳定下来(或用不同的机制替代它),允许开发第三方的二进制框架。这个工作量很大,并需要标准库 ABI 保持稳定。
新的脚本功能: 包括正则表达式、多行字符串字面量等。有了这些功能,Swift 在密集型文本处理任务及搭建 web 等方面会更有吸引力。这些功能也有助于完善字符串模型。
属性行为 :这一功能承诺为现有属性模型提供强大的抽象能力。在被推迟的 SE-0030 提案中对它有完整描述。
其他功能 :子模块、数值类型间的隐式转换、导入 C++ API、hygenic macro system、尾调用约定、枚举类型遍历、带类型的“thorws”、用户定义属性、抽象方法 / 类、更好的 SIMD 支持、非 @objc 的动态支持、支持数据并行、更高等级的类型...
语法糖 :我不会把它们全部列出来,但有大量零散的小提案会经常出现,特别是那些其他语言中出现过、用于解决特定问题的。这些在 Swift 4 开发中都属于最低优先级。
好了,这是一封超长的邮件,列出了一些关于明年要做的事的想法与点子。有一点要提醒一下大家,目前 Swift 3 尚未完成。当对代码的破坏性改动(将要)完成时,需要留有一些时间来修复 Bug 并提升代码质量,这对于正式发布版很重要。
我认为如果我们马上花一些时间来讨论明年开发计划的一些基本事项,会很有帮助,然后再从概念上分解一些第一阶段的特性。只有在对它们有深入了解之后,我们才应该开始写一些提案。核心团队不希望被太多提案淹没,以至于无法跟踪它们的进展,或让我们无法专注于那些高优先级的项目中。
谢谢大家。再次提醒一下,如果大家想要更深入讨论某个话题,请重新开一个分支。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。
Emoji 上的 Swift:换一种视角来理解 Swift 高阶函数
不久之前,Iain Delaney 给我发了这一幅图:
这幅由 Steve Luscher 设计的图,其内容来源于 Joey Devilla 的博客 Global Nerdy 中的一篇文章。我觉得这种做法相当有才,让人眼前一亮。
然而,这幅图不是用 Swift 编写的,显然没办法在 Swift 中运行。我决定娱乐一番:我建立了一个 Playground,将大量的 Emoji 字符分配到对应的 Emoji 变量当中,由此构建了一个庞大的列表,然后使用 Swift 的语法让这些例子能够正确运行。
我决定听从 Jaden Geller 在 Twitter 上的所提出的建议,我没有使用便便?来表示 reduce
操作,因为这原先会让人理解为:在每个 reduce
操作执行的时候,都是将便便和一个新的食物合起来一同「吃下」。在 Swift 的版本当中,reduce
将从一个悲伤的表情?开始,最后变得高兴和满足?。
我尝试加了更多的食物种类,看看是否值得扩展一下图片上的内容,但是我发现一旦示例数量超过了原先的 4 种食物,就不够干净和优雅了:
我决定不再使用奶牛?、土豆?、小鸡?和玉米?,我想看一看是否存在一个比 isVegetarian
更好的 filter
选项。比如说孩子们将会选择自己爱吃的食物(往往并不营养):
然后我又想到,那么为什么不再多加一些 Swift 语言的特性呢?于是我决定描述一下可变和不可变项目操作的概念:
以及重复操作:
还有排序操作(虽然我觉得这里可能换用别的食物会更好一些):
当然了,zip
操作同样很赞:
然后还有 map
与 flatMap
的对比:
很遗憾的是,足球并不是一个合法的字符标识符,所以我无法在足球和橄榄球之间执行 bitcast
操作。这种不一致的 Emoji 字符集让我很不开心。Swift 需要对操作符和标识符进行基于标准的改造。
当我在鼓捣 fatalError
的时候,我发现我的时间都耗费在这里了:
不知道您是否有喜爱的 Swift 功能,想用 Emoji 将其表示出来吗?我已经向大家展示了我的想法。现在,是时候展示您的想法了。
更新:Phil Aaronson 建议还可以使用 emoji 函数。
@ericasadun functions too! pic.twitter.com/IDwDBps2WD
— Phil Aaronson (@phildrone) November 8, 2016
理想情况下,这些示例应当都可以在 Swift Playground 当中编译运行,我同样赞同使用其他 Emoji 来阐述这些功能,即使实现起来相当棘手。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。
关于最详尽的 Swift 代码规范指南 和swift代码规则 的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于#翻译# Google 的 Objective-C 代码规范指南、AWESOME SWIFT-swift.libhunt.com-swift类库网站、Chris Lattner 对 Swift 3 的总结与对 Swift 4 的展望、Emoji 上的 Swift:换一种视角来理解 Swift 高阶函数 的相关信息,请在本站寻找。