ios swift 知识点记录
1. 定义变量 var name = "***"
定义常量 let name ="*****"
2. swift 变量类型 String, Int, Float, Double
3. swift 逻辑操作符 && , ||, !
4. swift 关系运算符 ==, !=, >=, <=
5. swift storyboard界面元素跟code绑定,右键(button , label什么的),左键按住划线到view, 选择对应的code 里的variable or 方法
6. swift 定义类似静态函数: class func methodName() -> type {}
静态变量: static var name:type = **** 调用的时候,是className.name() 这样的方式
7. var xxx = Object! 意思是显示转换, “!”代表这个有可能没有值
8. 实例化: myStation = RadioStation.init(name: "KZZP", frequency: 104.7) 或 myStation = RadioStation()
9. 创建新Class, 需要在IDE选Cocoa Touch Class
10.Stretching label, 是自动拉伸,否则,会截断text内容
11.给storyboard 上的button添加方法的另一种操作
12. 数组定义 var myArray: [string] = ["One", "Two"] print(myArray[0]) 数组长度:myArray.count 数组扩展:myArray.append("Three"), myArray += ["Four","Five"], myArray.insert("Zero", at: 0) 删除: myArray.remove(at: **)
13. for 循环
for y in 0 .. <numbers{
}
14. 日期比较 today.compare(date)
15. ios preference 存储
let prefs: UserDefaults = UserDefaults.standard
prefs.set("sherlock.holmes", forKey: "username")
prefs.set(10, forKey: "booksInList")
prefs.synchronize()
import CoreData class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var managedObjectContext: NSManagedObjectContext! //managed object context func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{return 1} override func viewDidLoad(){ let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate managedObjectContext = appDelegate.persistentContainer.viewContext as NSManagedObjectContext //将contextObject 链接到appDelegate } func loadBooks() -> [Book] { let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest() var result: [Book] = [] do { result = try managedObjectContext.fetch(fetchRequest) } catch { NSLog("My Error: %@", error as NSError) } return result } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return loadBooks().count }func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else { return UITableViewCell() } let book: Book = loadBooks()[indexPath.row] cell.textLabel?.text = book.title return cell } @IBAction func addNew(_ sender: Any) { let book: Book = NSEntityDescription. insertNewObject(forEntityName: "Book", into: managedObjectContext) as! Book book.title = "My Book" + String(loadBooks().count) do { try managedObjectContext.save() } catch let error as NSError { NSLog("My Error: %@", error) } myTableView.reloadData() }
//根据实体名查询
let fetchRequest = NSFetchRequest(entityName: "People")
//设置查询条件
let predicate = NSPredicate(format:"id=1 and / or / not name='xx'")
fetchRequest.predicate=predicate
do {
let peopleList = try context.executeFetchRequest(fetchRequest)as! [NSManagedObject]
for person in peopleListas! [People] {
print("查询到的人是\(person.name!)")
//修改操作:将查询到的结果修改后,再调用context.save()保存即可
if (person.name =="小红"){
person.name="小花"
}
//删除操作:将查询到的额结果删除后,再调用context.save()保存即可
if (person.name =="小明"){
context.deleteObject(person)
}
}
}catchlet error{
print("context can't fetch!, Error:\(error)")
}
do {
try context.save()
print("保存成功")
}catch let error{
print("context can't save!, Error:\(error)")
}
CoreData 多表
多条件查询:
CoreData中实体关联关系有三种,一对一,一对多,多对多,举一个简单的例子Accoun和Order之间关系.一个账户有多个订单

户.


设置关联之后还需要设置对应的删除规则(Delete Rule),苹果默认的关联规则是Nullify:

Deny 关系的Destination中只要有一个对象,就不能删除,如果账户还有订单,就不能删除账户
Nullify 只在逆向关系Optional的时候有效,Accout 删除之后,所有的Order中的account信息设置为nil
Cascade 删除对象后,删除destination所有对象.Account删除之后,会删除所有对应的Order对象.
NoAction 删除对象后,对Destination不做任何操作,在Destination中有大量对象的时候有用
设置关联关系,新建立一个订单,设置Order的关联对象是Account:
do { let account:Account = Account.findAccountByName(name: "FlyElephant")! let privateContext:NSManagedObjectContext = try CoreDataManager.sharedManager.newPrivateQueueContextWithNewPSC() let order:Order = NSEntityDescription.insertNewObject(forEntityName: "Order", into: privateContext) as! Order order.orderName = "台湾小零食--\(1)" order.orderNumber = Int32(100) order.account = account if privateContext.hasChanges { do { print("保存成功") try privateContext.save() } catch { let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } catch { print(error) }
Account和Order不在同一个Context上下文中,会出现错误,可以在同一个上下文中进行实体对象查询
static func findAccountByName(name:String) -> Account? { let context:NSManagedObjectContext = CoreDataManager.sharedManager.mainQueueContext let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Account") let predicate = NSPredicate.init(format: " accountName = %@", name) fetchRequest.predicate = predicate do { let searchResults = try context.fetch(fetchRequest) if searchResults.count > 0 { let account:Account = searchResults[0] as! Account return account } else { return nil } } catch { print(error) } return nil }
do { let account:Account = Account.findAccountByName(name: "FlyElephant")! let privateContext:NSManagedObjectContext = try CoreDataManager.sharedManager.newPrivateQueueContextWithNewPSC() let order:Order = NSEntityDescription.insertNewObject(forEntityName: "Order", into: privateContext) as! Order order.orderName = "FlyElephant-台湾小零食--\(1)" order.orderNumber = Int32(100) let accountInContext:Account = privateContext.object(with: account.objectID) as! Account order.account = accountInContext if privateContext.hasChanges { do { print("保存成功") try privateContext.save() } catch { let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } catch { print(error) }
占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
分页查询
NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"RSSEntryModel" inManagedObjectContext:_managedObjectContext]; [request setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articleDate" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [request setSortDescriptors:sortDescriptors]; [request setFetchLimit:21]; [request setFetchOffset:_currentPage * 21]; NSArray *rssTemp = [_managedObjectContext executeFetchRequest:request error:&error];
17 Protocols and Delegates
Protocol Definition protocol RandomNumberGenerator { var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get } func random() -> Double }
import UIKit // protocol used to send data back to the home view controller's userDidFinish protocol GuessDelegate { func userDidFinish(_ controller:GuessInputViewController, guess: String) } class GuessInputViewController: UIViewController { var delegate: GuessDelegate? var previousGuess: String = "" @IBOutlet weak var guessLabel: UILabel! @IBOutlet weak var guessTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. if(!previousGuess.isEmpty) { guessLabel.text = "Your previous guess was \(previousGuess)" } guessTextField.becomeFirstResponder() } @IBAction func saveGuess(_ sender: AnyObject) { if let delegate = delegate, let guessText = guessTextField.text { delegate.userDidFinish(self, guess: guessText) } } }
protocol XXXDelegate{ func methodA(data)}
classA{
var objectA: XXXDelegate? = nil
objectA.methodA(data)
}
classB : XXXDelegate{
func methodA(data){}
}
这样就实现了两个Controller之间的数据传递
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】