跳转至

Swift

Swfit资料#

宣传平台#

producthunt
Indie Hackers
一个海外的分析kit
营销截图汇总

app销量分析#

点点数据

点子#

有趣的app#

通过截图提取社交信息等支持导出
- 截图功能
- ocr识别
- coreml
- 数据训练集合
- gridlayout
- 点击跳转到相关页面

Mind Depot on the Mac App Store

apple 开发者网页#

App Store Connect
Apple developer
Swfit Api
github上一位放电子书的大佬
告诉我同值多选xcode快捷键的小哥的网站swfit
wwdc 关于LiveText的部分 visionKit
All Video in developer apple
ios版本分布
关于ios内购
网易云音乐 iOS 14 小组件实战手册 - 掘金
Swiftui官方社区 github,细到发指

Swift#

入门#

字符串插值#

在Swift中,使用反斜杠(\)和圆括号(())来进行字符串插值。字符串插值是一种将常量、变量、表达式或者字面量插入到字符串字面量中的方式,以便于在字符串中包含变量或表达式的值。
在给定的代码示例中,(名字) 是一个字符串插值的语法,其中名字是一个变量或常量,它会被替换为其对应的值。所以,当执行 print("\(名字):旺旺~") 时,会将名字的值插入到字符串字面量中,输出类似于 "某个名字:旺旺~" 的结果。

struct#

struct Dog{
var 名字 : String
var 年纪 = 0
let 品种 : String
func 叫(){
    print("\(名字):旺旺~")
}

}

巧思#

Optional(可选参数)#

[iOS][Swift][中文] 基礎語法#12. 初探Optional
有的时候并不是之使用自己产生而资料,有的资料是从网路获取而来的
这个时候数据有可能是确定值,有可能是nil

强制解包(Force Unwrapping)#

//非闭包的写法
var str : String?
var str : Optional<String>

str = "123123"
str = nil

if str != nil {
    print(str!) // 强制解包 
    print(type(of: str!)) 
} else { 
     print("str is nil") 
}

//通过惊叹号进行了强制解包

可选绑定(Optional Binding)#

//完整的闭包写法
var str : String?
var str : Optional<String>

str = "123123"
str = nil

print(str!)
print(type(of : str))


if let newStr=str{
    print(newStr)
    print(type(of:(newStr)))
} else {
    print("stl is nil")
}

// if let newStr=str 是可选绑定的语法,用于判断str是否为可选类型,
// 并将其解包赋值给newStr,如果str不为nil,进入if语法块,否则进入else语法块

在这段代码中,str 后面的大括号 {} 表示一个闭包(Closure)。闭包是一种自包含的函数代码块,可以在代码中被传递和使用。

在这个特定的代码中,大括号内的闭包用于定义 if let 语句块的内容。闭包内部的代码会在 str 不为 nil 时执行。这种用法常见于 Swift 中的可选绑定,可以在 if letguard let 语句中使用闭包来处理可选类型的值。

闭包的语法由大括号 {} 包围,可以包含参数列表、返回类型和函数体。在这个代码中,闭包没有参数列表和返回类型,只有一个函数体。

guard let 和 if let#

if let是Swift中的一种语法,用于处理可选类型。它的作用是将一个可选类型解包并将其赋值给一个非可选类型的变量或常量。如果可选类型为nil,则if let语句中的代码块将不会被执行。这种语法可以避免在代码中使用强制解包,从而减少了代码中的错误和崩溃的风险。
guard let 语句用于在代码块中进行可选绑定,并在绑定失败时执行特定的代码块。它的语法如下:

guard let constantName = optionalExpression else {
    // 当 optionalExpression 为 nil 时执行的代码
    // 通常是提前退出或处理错误的逻辑
    // return 或者抛出异常等
}
// 当 optionalExpression 不为 nil 时执行的代码
// 可以使用 constantName

guard let 语句与 if let 语句类似,都是用来处理可选类型的值。但是它们有一些区别:

  • guard let 通常用于提前退出函数或方法,以避免嵌套过多的代码块。
  • guard let 必须在代码块的开头使用,而 if let 可以在任何地方使用。
  • guard let 必须有一个与可选类型绑定的常量或变量,并且在绑定失败时执行特定的代码块。
  • guard let 语句的代码块结束后,绑定的常量或变量在后续代码中仍然可用。

以下是一个使用 guard let 语句的示例:

func processString(str: String?) {
    guard let newStr = str else {
        print("str is nil")
        return
    }
    // 当 str 不为 nil 时执行的代码
    print(newStr)
    print(type(of: newStr))
}

processString(str: "Hello, World!") // 输出: Hello, World!,String
processString(str: nil) // 输出: str is nil

在上面的示例中,guard let 语句用于检查传入的 str 是否为 nil。如果 strnil,则会打印 "str is nil" 并提前退出函数。如果 str 不为 nil,则会将其绑定到常量 newStr 上,并执行后续的代码块。

希望这个解释对您有帮助!如果您还有其他问题,请随时提问。

Closeture(闭包)#

理解#

简单来讲,js中的箭头函数就是闭包的一种,可以作为参数传递之,
是面向函数编程的一大体现,是一种高阶函数的落地实现

解释1#

尾随闭包是指在调用函数时,将闭包表达式写在函数调用的括号之外的一种语法特性。这样做可以使代码更为清晰,特别是当闭包是函数的最后一个参数时。尾随闭包的使用使得代码更易读,尤其在函数调用包含多行闭包时,可以提高可读性。

考虑以下的例子,使用 map 函数对数组中的元素进行转换:

let numbers = [1, 2, 3, 4, 5]  
// 普通闭包语法
let doubled1 = numbers.map({ (number: Int) -> Int in     return number * 2 })
// 尾随闭包语法
let doubled2 = numbers.map { (number: Int) -> Int in     return number * 2 }`

在这里,map 函数接受一个闭包作为参数,用于定义对数组元素的映射操作。在普通闭包语法中,闭包写在函数的括号内,而在尾随闭包语法中,闭包写在函数括号外。

解释2#

在 Swift 中,尾闭包(Trailing Closure)是一种特殊的闭包语法,用于在函数调用中以更简洁的方式传递闭包参数。通常,闭包作为函数的最后一个参数传递给函数,但是使用尾闭包语法,可以将闭包参数写在函数调用的括号外面,使代码更易读。

尾闭包的语法格式如下:

func someFunction(argument1: Int, argument2: String, closure: () -> Void) {
    // 函数体
}

someFunction(argument1: 10, argument2: "Hello") {
    // 尾闭包的代码
}

在上面的例子中,someFunction 是一个接受一个整数参数和一个字符串参数的函数,并且接受一个闭包作为最后一个参数。使用尾闭包语法,我们可以将闭包参数写在函数调用的括号外面,使代码更清晰。

尾闭包的优势在于,它可以将闭包的逻辑与函数调用的参数列表分开,使代码更易读和维护。特别是在闭包的代码比较长或复杂时,尾闭包可以提高代码的可读性。

需要注意的是,尾闭包只能在函数调用时使用,而不能在其他地方单独使用。另外,如果函数除了尾闭包外还有其他参数,尾闭包必须是函数参数列表中的最后一个参数。

SwiftUI#

viewmodifier#

ViewModifier是一个协议,它可以让你创建一个可重用的修改器,用来修改任何视图。要创建自定义的ViewModifier,你需要遵循ViewModifier协议,并实现一个body(content:)方法,它接受一个视图作为参数,并返回一个修改后的视图。例如,你可以创建一个Title修改器,用来给视图添加一个大标题、白色的前景色、蓝色的背景色和圆角矩形的形状,代码如下1

struct Title: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.largeTitle)
            .foregroundStyle(.white)
            .padding()
            .background(.blue)
            .clipShape(.rect(cornerRadius: 10))
    }
}

要使用自定义的ViewModifier,你可以用modifier(_:)方法来应用它到一个视图上,例如:

Text("Hello, world!")
    .modifier(Title())

你也可以为View协议扩展一个方法,来封装你的ViewModifier,使得它更容易使用,例如:

extension View {
    func titleStyle() -> some View {
        self.modifier(Title())
    }
}

这样你就可以直接用titleStyle()方法来修改视图,例如:

Text("Hello, world!")
    .titleStyle()

ViewModifier可以让你把常用的视图修改封装成一个单元,方便你在整个应用中复用。你可以根据你的需求来创建不同的ViewModifier,来实现各种自定义的效果。如果你想了解更多关于ViewModifier的用法和示例,你可以参考以下的网页2345

协议#

SwiftUI是一种基于Swift语言的声明式UI框架,它充分利用了Swift的面向协议编程的特性,来实现视图的组合、数据的绑定和动画的控制。SwiftUI中的面向协议编程的落地实现有以下几个方面:

以上就是我对SwiftUI中的面向协议编程的落地实现的一些总结,如果你想了解更多的细节和示例,你可以参考以下的一些资源:

  • [SwiftUI 中的功能构建器 - SwiftGG 翻译组]
  • [SwiftUI 中的手势 - SwiftGG 翻译组]