github.com/ebitengine/purego@v0.8.0-alpha.2.0.20240512170805-6cd12240d332/examples/objc/main_darwin.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors 3 4 package main 5 6 import ( 7 "fmt" 8 "reflect" 9 10 "github.com/ebitengine/purego/objc" 11 ) 12 13 var ( 14 sel_new = objc.RegisterName("new") 15 sel_init = objc.RegisterName("init") 16 sel_setBar = objc.RegisterName("setBar:") 17 sel_bar = objc.RegisterName("bar") 18 ) 19 20 func BarInit(id objc.ID, cmd objc.SEL) objc.ID { 21 return id.SendSuper(cmd) 22 } 23 24 func main() { 25 // This struct is equivalent to the following Objective-C definition. 26 // 27 // @interface BarObject : NSObject <NSDelegateWindow> 28 // @property (readwrite) bar int 29 // @end 30 class, err := objc.RegisterClass( 31 "BarObject", 32 objc.GetClass("NSObject"), 33 []*objc.Protocol{ 34 objc.GetProtocol("NSDelegateWindow"), 35 }, 36 []objc.FieldDef{ 37 { 38 Name: "bar", 39 Type: reflect.TypeOf(int(0)), 40 Attribute: objc.ReadWrite, 41 }, 42 }, 43 []objc.MethodDef{ 44 { 45 Cmd: sel_init, 46 Fn: BarInit, 47 }, 48 }, 49 ) 50 if err != nil { 51 panic(err) 52 } 53 54 object := objc.ID(class).Send(sel_new) 55 object.Send(sel_setBar, 123) 56 bar := int(object.Send(sel_bar)) 57 fmt.Println(bar) 58 // Output: 123 59 }