Mario tsai




開一個project 例如: CoolUI



import CoolUI 後就可以使用裡面方法。

  1. Create framework

2. Add needed classes

3. Build Settings / Build Libraries for Distribution set YES

4. Build Settings / Skip Install set NO

5. Open termnial

6. cd and drag the folder with project

7. run three scripts in turn, which are located at the bottom (!) Don’t forget replace “PROJECTNAME_HERE” & “”FRAMEWORK_NAME” on your project name.

xcodebuild archive -scheme PROJECTNAME_HERE -destination=”iOS” -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO

xcodebuild archive -scheme PROJECTNAME_HERE -destination=”iOS Simulator” -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO

xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/PROJECTNAME_HERE.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/PROJECTNAME_HERE.framework -output FRAMEWORK_NAME.xcframework



under iOS13

class viewModel: {    var reloadCount: Int = 0    //ViewModel send to View   => react the event
var reloadCollectionView: ( ()->() )?

//View call ViewModel => user touch the Buttom (event)
func onTapCellButton() {
reloadCount += 1 self. reloadCollectionView?()



It’s a true story. It happens by accident.

class VC1 :UIViewController() {  let viewModel = VC1ViewModel()  func callVC2(){     let vc2 = UIViewController()     vc2.onTap = { (value) in         self.viewModel.callMom()  }  deinit(){
print("VC1 dead")

So, When VC1 dismiss or popup. VC2 and viewModel still in alive.

It prints nothing.

Change callVC2 like this

func callVC2(){    let vc2 = UIViewController()    vc2.onTap = { [weak self] (value) in        self?.viewModel.callMom()}

When VC1 dismiss or popup, Your memory is free!!!




use Realm

let realm = try! Realm()

Make a Model

import Foundation

import RealmSwift

class LogData: Object{

@Persisted(primaryKey: true) var _id: ObjectId

@Persisted var date: String?

@Persisted dynamic var time: String?

convenience init(content: String){




func addNewLog(_ time:String,_ date:String) -> LogData{

let newLog = LogData()

newLog.time = time = date

return newLog


func save() {

let newLog = self.addNewLog(selectedTime, didSelectDate)

try! realm.write{







增刪改檔案後記得下 composer dump-autoload

### 顯示路由
php artisan route:list

### new 一個controller
php artisan make:controller ProductController

//做一個ProductController 包含基本的增刪修改
php artisan make:controller ProductController — resource

ps: Laravel8 用router 要在RouteServiceProvider 裡面增加變數 protected $namespace = ‘App\Http\Controllers’;

### new 一個table
//做一張表 members
php artisan make:migration create_members

##### Route Bug
-> php artisan serve 後連接有正常accept close,但是沒有畫面
-> 有重複的路徑 檢查Route 然後下 php artisan optimize 清掉cache



Big company has lots of ObjC code

/## Swift

class Person: NSObject {

var _name: String

init(name: String){

_name = name


function setName(name:String){

_name = name



run in playground



@interface Person : NSObject {

NSString* _name;


-(void)setName: (NSString*) name;

-(NSString*) name;


@Implementation Person

-(void)setName: (NSString * )name {

_name = name;


-(NSString*) name {

return _name;


Actually, run in Main.m

Person* p1 =[Person new];

[p1 setName:@”Dancer”];

NSLog(@”%ld”, [p1 age]);



Big company has lots of ObjC code

Swfit -> ObjC


var name:String = Mario


/## ObjC

@interface ViewController ()

@property (nonatomic, strong) NSString* userName;


@implementation ViewController

NSLog(@”%@”, self.userName);




Mario tsai

Mario tsai

Major in physical education. Football referee. And high interest in looking the world through the numbers.