मैं स्विफ्ट 2 से स्विफ्ट 3 तक एक लुआ पुल को बदलने की कोशिश कर रहा हूं। मैं मूल लेखक नहीं हूं इसलिए लाइब्रेरी के पहलू हैं जिन्हें मैं बहुत अच्छी तरह से नहीं जानता और मूल लेखक काम करना जारी रखने में रुचि नहीं रखते हैं परियोजना। मेरे पास अधिकांश रूपांतरण किए गए हैं लेकिन वहां एक जगह है जहां मैं फंस गया हूं और पता नहीं लगा सका। मैंने एसओ और इंटरनेट पर खोज करने की कोशिश की है लेकिन मुझे कुछ भी नहीं मिला जो समस्या को हल करने में मेरी मदद कर सकता है।एक सी फंक्शन से 'void *' वापसी को स्विफ्ट 3 में 'UnsafeMutableRawPointer' में कैसे परिवर्तित करें?
अगर कोई पूर्ण स्रोत कोड देख में रुचि रखता है, यहाँ GitHub पर परियोजना की मेरी कांटा है: https://github.com/weyhan/lua4swift (मेरे परिवर्तन Swift3 शाखा में है)
मुझे सेटअप त्रुटि मैं करने के लिए संदर्भ की अनुमति दें मैं अटक गया उपयोगकर्ता आईडीटा श्रेणी है, खासकर विधि userdataPointer<T>() -> UnsafeMutablePointer<T>
में सी फ़ंक्शन lua_touserdata
उपयोगकर्ता डेटा का ब्लॉक पता void *
सूचक प्रकार के रूप में देता है।
मूल स्विफ्ट 2 में लिखे कोड:
return UnsafeMutablePointer<T>(ptr)
मैं इसे ठीक करने के बाद:
public class Userdata: StoredValue {
public func userdataPointer<T>() -> UnsafeMutablePointer<T> {
push(vm)
let ptr = lua_touserdata(vm.vm, -1)
vm.pop()
return UnsafeMutablePointer<T>(ptr)
}
public func toCustomType<T: CustomTypeInstance>() -> T {
return userdataPointer().memory
}
public func toAny() -> Any {
return userdataPointer().memory
}
override public func kind() -> Kind { return .Userdata }
}
Xcode 8 प्रवास उपकरण के साथ रूपांतरण के बाद, Xcode त्रुटि Cannot invoke initializer for type 'UnsafeMutablePointer<T>' with an argument list of type '(UnsafeMutableRawPointer?)'
साथ वापसी लाइन के बारे में शिकायत कर रहा है के साथ:
return (ptr?.assumingMemoryBound(to: T.self))!
ऊपर दिए गए परिवर्तन के बाद, अब एक्सकोड 8 अब createCustomType
में बुला बयान के बारे में शिकायत की है:
public func createCustomType<T: CustomTypeInstance>(setup: (CustomType<T>) -> Void) -> CustomType<T> {
lua_createtable(vm, 0, 0)
let lib = CustomType<T>(self)
pop()
setup(lib)
registry[T.luaTypeName()] = lib
lib.becomeMetatableFor(lib)
lib["__index"] = lib
lib["__name"] = T.luaTypeName()
let gc = lib.gc
lib["__gc"] = createFunction([CustomType<T>.arg]) { args in
let ud = args.userdata
// ******* Here's the line that is causing problem in Swift 3
(ud.userdataPointer() as UnsafeMutablePointer<Void>).destroy()
// *******
let o: T = ud.toCustomType()
gc?(o)
return .Nothing
}
if let eq = lib.eq {
lib["__eq"] = createFunction([CustomType<T>.arg, CustomType<T>.arg]) { args in
let a: T = args.customType()
let b: T = args.customType()
return .Value(eq(a, b))
}
}
return lib
}
मैं कर रहा हूँ कहाँ अटक लाइन है:
(ud.userdataPointer() as UnsafeMutablePointer<Void>).destroy()
मेरा मानना है कि मूल लेखक स्मृति ब्लॉक जहां सूचक लौटे खाली करने के लिए प्रयास कर रहा है userdataPointer()
द्वारा कॉल इंगित कर रहा है।
:
(ud.userdataPointer() as UnsafeMutableRawPointer).deinitialize()
हालांकि Xcode अब शिकायत है कि Cannot convert call result type 'UnsafeMutablePointer<_>' to expected type 'UnsafeMutableRawPointer'
तो है।
मेरे शोध से, userdataPointer
में रिटर्न लाइन में परिवर्तन सही लगता है, इसलिए मुझे लगता है कि यह समस्या असुरक्षित MawableRawPointer को कास्ट के साथ है। मैंने UnsafeMutableRawPointer
पर कास्ट छोड़ने की कोशिश की है और सीधे ud.userdataPointer().deinitialize()
का आह्वान किया है लेकिन मुझे यह त्रुटि Generic parameter 'T' could not be inferred
मिलती है।
अन्य चीजें जो मैंने कोशिश की है वह असुरक्षित म्यूचुअल पॉइंटर को असुरक्षित म्यूचुअल राउपॉन्टर में परिवर्तित करना है, लेकिन यह हमेशा एक्सकोड 8 में एक चीज़ या किसी अन्य की शिकायत करता है। काम करने के लिए इसे कैसे प्राप्त करें इस पर कोई सुझाव?
स्विफ्ट 3 migrator उन '.memory' कन्वर्ट करने के लिए लगता है 'पॉइंट' सही करने के लिए। आप सही हैं कि माइग्रेटर कुछ स्थानों पर भ्रमित हो गया लेकिन आम तौर पर यह अधिकांश रूपांतरणों में काम करता है। मैंने अपमानजनक रेखा को बदलकर इसे ठीक करने में कामयाब रहा है: 'UnsafeMutablePointer (ud.userdataPointer())। Deinitialize() ' मुझे लगता है कि यह सही है लेकिन यदि आपको पता है कि यह गलत है तो मैं आपकी सराहना करता हूं मुझे पता है। लंबे विश्लेषण के लिए धन्यवाद! –
आपने जो किया वह वही काम करता है जैसा मैंने सुझाया था। किसी भी तरह से हमें कंप्रेसर को बताने के लिए केवल एक कास्ट या प्रारंभिकता की आवश्यकता होती है जो 'userdataPointer() 'को कॉल करते समय जेनेरिक पैरामीटर होता है।सावधान रहें, हालांकि: पुराने कोड में समस्याग्रस्त रेखा ने उपयोगकर्ता डेटा को प्रारंभ नहीं किया था। नया कोड होगा। यदि बाद में 'toCustomType()' कॉल एक ही उपयोगकर्ता डेटा ऑब्जेक्ट को वापस करने का प्रयास करता है, तो यह पहले ही डी-प्रारंभिक होगा। बेशक, मुझे सामान्य अवलोकन साझा करने के लिए कोड नहीं पता है। – OmniProg
पुराना कोड इस लाइन का अर्थ है? '(ud.userdataPointer() UnsafeMutablePointer) .destroy()'। सर उठाने के लिए धन्यवाद। मैं इसमें देख लूंगा। –