Swift
Swfit资料#
- Swift for Complete Beginners(100days)_油管
- 100 DAYS OF SWIFTUI_哔哩哔哩
- Hacking with iOS: SwiftUI Edition_哔哩哔哩
- Hacking with iOS: SwiftUI Edition_油管
- Hacking with Swift
- 2023 | CS193p - Developing Apps for iOS
- chaocode 油管
- chaocode b站
- mastering-swiftui 电子书
- 中文版 Apple 官方 Swift 教程
- Swift Public语雀
- apple人机交互指南
- swiftUI文档
- uikit
- b站 实操SwfitUI
- kavsoft 油管
- widget小组件动画效果
- Journaling Suggestions | Apple Developer Documentation
- Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.
- 一些适合 SwiftUI 初学者的教程 - 知乎
- swiftui thinking
- swift basic
- SwiftUI b站丰原天下
- Swift语言解释
- Swift [Public]1
- 属性 - SwiftGG
- iOS新知/ 掘金
- Learning SwiftUI | Apple Developer Documentation
- Maintaining the adaptable sizes of built-in views | Apple Developer Documentation
- 一个闪屏展示效果
宣传平台#
producthunt
Indie Hackers
一个海外的分析kit
营销截图汇总
app销量分析#
点子#
- double clip 翻动iphone屏幕
实时动态的发生的事Here's what's happening today in design: pic.twitter.com/1o1bm4aSoR
— Cole (@colderoshay) October 9, 2023
有趣的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 let
或 guard 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
。如果 str
为 nil
,则会打印 "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中的所有视图都遵循了一个核心的协议,叫做View。View协议定义了一个关联类型Body,表示视图的内容,以及一个只读属性body,返回一个遵循View协议的类型。这样,我们可以通过组合不同的视图,来构建复杂的UI界面。例如,Text、Image、Button等都是遵循View协议的视图,我们可以使用VStack、HStack、ZStack等容器视图,来横向、纵向或者重叠地排列它们。1
- SwiftUI中的视图可以使用修饰符(modifier)来改变它们的外观和行为。修饰符是一种特殊的方法,它接受一个遵循View协议的类型作为输入,返回一个遵循View协议的类型作为输出。修饰符可以使用链式调用的方式,来叠加不同的效果。例如,我们可以使用.foregroundColor、.font、.padding等修饰符,来改变文本的颜色、字体和边距。1
- SwiftUI中的视图可以使用@State、@Binding、@ObservedObject、@EnvironmentObject等属性包装器(property wrapper)来声明它们的状态和数据源。属性包装器是一种使用@propertyDelegate修饰的泛型类型,它可以为属性提供一些额外的功能和存储空间。属性包装器可以实现视图和数据之间的双向绑定,当数据发生变化时,视图会自动刷新,反之亦然。例如,我们可以使用@State来声明一个私有的可变状态,使用@Binding来声明一个与其他视图共享的状态,使用@ObservedObject和@EnvironmentObject来声明一个遵循ObservableObject协议的对象,它可以发布数据的变化。23
- SwiftUI中的视图可以使用@ViewBuilder、@GestureState、@Animation等功能构建器(function builder)来简化代码的书写和逻辑的处理。功能构建器是一种使用@_functionBuilder修饰的类型,它可以将一个多行的闭包转换为一个单一的返回值。功能构建器可以实现视图的条件渲染、手势的状态管理和动画的控制。例如,我们可以使用@ViewBuilder来根据不同的条件返回不同的视图,使用@GestureState来记录手势的临时状态,使用@Animation来指定动画的参数。
以上就是我对SwiftUI中的面向协议编程的落地实现的一些总结,如果你想了解更多的细节和示例,你可以参考以下的一些资源:
- [SwiftUI 中的功能构建器 - SwiftGG 翻译组]
- [SwiftUI 中的手势 - SwiftGG 翻译组]