1.pythonä¸çè¯è¨(pythonä¸çè¯è¨åºå大å°åå)
2.一键自动修改和翻新OC源码,马源码解决苹果审核4.3和马甲问题
3.å¦ä½å¨vueä¸ä½¿ç¨tsç示ä¾ä»£ç
pythonä¸çè¯è¨(pythonä¸çè¯è¨åºå大å°åå)
Pythonè¯è¨çç¹ç¹æ¯ä»ä¹ï¼
Pythonè¯è¨çç¹ç¹ï¼
1ãç®åæå¦ï¼Pythonæ¯ä¸ç§ä»£è¡¨ç®å主ä¹ææ³çç¼ç¨è¯è¨ï¼é 读ä¸ä¸ªè¯å¥½çPythonç¨åºçæ¶åå°±ç¹å¦å¨è¯»è±è¯ä¸æ ·ãPythonæ大çä¼å¿å°±æ¯ä¼ªä»£ç çæ¬è´¨ï¼å¨å¼åçæ¶å主è¦ä»¥è§£å³é®é¢ä¸ºä¸»è¦ï¼å¹¶ä¸æ¯ææç½è¯è¨çæ¬èº«ã
2ãé¢å对象ï¼Pythonæ¢æ¯é¢å对象çç¼ç¨ï¼ä¹æ¯é¢å对象ç¼ç¨ï¼ä¸å ¶ä»ä¸»è¦çè¯è¨C++åJava对æ¯æ¥è¯´ï¼Pythonæ¯ä»¥ä¸ç§é常强大èä¸ç®åçæ¹å¼æ¥å®ç°é¢å对象çç¼ç¨ã
3ãå¯ç§»æ¤æ§ï¼Pythonå ·æå¼æºçæ¬è´¨ï¼å¯ä»¥è¢«ç§»æ¤å¨è®¸å¤çå¹³å°ä¸ï¼æ¯å¦è¯´LnuxãWindowsãFreeBSDãMacintoshã
SolarisãOS/2ãAmigaãAROSãAS/çï¼Pythoné½å¯ä»¥å¾å¥½çè¿è¡å ¶ä¸ã
4ã解éæ§ï¼Pythonè¯è¨åçç¨åºä¸éè¦ç¼è¯æ为äºè¿å¶ç代ç ï¼å¯ä»¥ç´æ¥ä»æºä»£ç è¿è¡ç¨åºï¼å¨è®¡ç®æºå é¨ï¼Python解éå¨å°æºä»£ç 转æ¢ç§°ä¸ºåèç çä¸é´å½¢å¼ï¼å¯ä»¥ç´æ¥ç¿»è¯è¿è¡ã
5ãå¼æºï¼Pythonè¯è¨æ¯å¼æºçãç®åçæ¥è¯´ï¼ä½ å¯ä»¥èªç±åå¸è¿ä¸ªè½¯ä»¶çæ·è´ï¼é 读æºä»£ç ï¼å¯¹å®è¿è¡æ¹å¨ï¼ç¨äºæ°çèªç±è½¯ä»¶ä¹ä¸ã
6ãé«çº§è¯è¨ï¼Pythonæ¯é«çº§ç¼ç¨è¯è¨ï¼å½ä½¿ç¨Pythonè¿è¡ç¼ç¨çæ¶åï¼æ éèèå¦ä½ç®¡çç¨åºä½¿ç¨çå åä¸ç±»çåºå±ç»èé®é¢ã
7ãå¯æ©å±æ§ï¼å¦ææ³è¦æ´å¿«çè¿è¡ï¼ä½æ¯æäºç®æ³ä¸å ¬å¼ï¼è¿ä¸ªé¨åçç¨åºå¯ä»¥éæ©ç¨Cè¯è¨è¿è¡ç¼åï¼ç¶ååPythonç¨åºä¸è¿è¡ä½¿ç¨ã
8ã丰å¯çåºï¼Pythonå ·æ丰å¯å¼ºå¤§çæ ååºï¼å¯ä»¥å¸®å©ä½ å¤çåç§å·¥ä½ï¼å ¶ä¸å å«äºæ£å表达å¼ãææ¡£çæãåå æµè¯ã线ç¨ãæ°æ®åºãç½é¡µæµè§å¨ãCGlãFTPãçµåé®ä»¶çï¼è¿äºåè½é½æ¯å¯ä»¥ä½¿ç¨çï¼æ以Pythonè¯è¨åè½åå强大ã
9ãè§è代ç ï¼å¨ä½¿ç¨Python书å代ç çæ¶åéç¨å¼ºå¶ç¼©è¿çæ¹å¼è®©ä»£ç å ·æé常好çå¯è¯»æ§ã
pythonè¯è¨æ¯ä»ä¹ï¼Pythonæ¯ä¸ç§è®¡ç®æºç¨åºè®¾è®¡è¯è¨ï¼ä½ å¯è½å·²ç»å¬è¯´è¿å¾å¤æµè¡çç¼ç¨è¯è¨ï¼æ¯å¦é常é¾å¦çCè¯è¨ï¼é常æµè¡çJavaè¯è¨ï¼éååå¦è çBasicè¯è¨ï¼éåç½é¡µç¼ç¨çJavaScriptçï¼Pythonå°±æ¯å ¶ä¸ä¹ä¸ã
ç¸å¯¹äºå ¶ä»ç¼ç¨è¯è¨ï¼Pythonå ·æèªå·±ç¬ç¹çä¼å¿ï¼å®å¯ä»¥ç¨æå°ç代ç å®æä»»å¡ãæ¯å¦å®æåä¸ä¸ªä»»å¡ï¼Cè¯è¨è¦åè¡ä»£ç ï¼Javaéè¦è¡ï¼èPythonå¯è½åªéè¦è¡ï¼æ以说Pythonæ¯ä¸é¨é常é«çº§çç¼ç¨è¯è¨ã
pythonçè¯è¨ç¹ç¹æåªäºpythonè¯è¨çç¹ç¹ä¸»è¦æé度快ãå è´¹ãå¯ç§»æ¤æ§ã解éæ§ãå¯æ©å±æ§çï¼å ·ä½å¦ä¸ï¼
1ãé度快ï¼Pythonçåºå±æ¯ç¨Cè¯è¨åçå¾å¤æ ååºå第ä¸æ¹åºä¹é½æ¯ç¨Cåçè¿è¡é度é常快ã
2ãå è´¹ï¼ä½¿ç¨è å¯ä»¥èªç±å°åå¸è¿ä¸ªè½¯ä»¶çæ·è´ãé 读æºä»£ç ãåæ¹å¨ãæä¸é¨åç¨äºæ°çèªç±è½¯ä»¶ä¸ã
3ãå¯ç§»æ¤æ§ï¼ç±äºå ¶å ·æå¼æºæ¬è´¨ï¼Pythonå·²ç»è¢«ç§»æ¤å¨è®¸å¤å¹³å°ä¸ï¼è¿äºå¹³å°å æ¬LinuxãWindowsFreeBSDMacintoshçã
4ã解éæ§ï¼Pythonè¯è¨åçç¨åºä¸éè¦ç¼è¯æäºè¿å¶ä»£ç å¯ä»¥ç´æ¥ä»æºä»£ç è¿è¡ç¨åºã
5ãå¯æ©å±æ§ï¼Pythonæ¬èº«è¢«è®¾è®¡ä¸ºå¯æ©å ç并éææçç¹æ§ååè½é½éæå°è¯è¨æ ¸å¿ãPythonæä¾äºä¸°å¯çAPIåå·¥å ·ä»¥ä¾¿ç¨åºåè½å¤è½»æ¾å°ä½¿ç¨Cè¯è¨ãC++Cythonæ¥ç¼åæ©å 模åãè¾¾å æè²å¼è®¾Python人工æºè½ä¸æ°æ®åæå®æ课ï¼å ææ½æ课ç¨è®¾è®¡æ»¡è¶³ä¸å人åå¦ä¹ éæ±ï¼OMO线ä¸çº¿ä¸åæ¥æå¦ï¼å ææ½æå级æå¦ã
æ³äºè§£æ´å¤æå ³pythonè¯è¨ç详æ ï¼æ¨èå¨è¯¢è¾¾å æè²ãè¾¾å æè²å ·æ丰åçå¸èµåéï¼ä¼ç§çæå¦ä½ç³»ï¼æå¦è´¨éçªåºï¼å®æ讲å¸ï¼ç»éªä¸°å¯ï¼ç论ç¥è¯+å¦ä¹ æç»´+å®ææä½ï¼æé å®æ´å¦ä¹ éç¯ãè¾¾å æè²ç¬åTTS8.0æå¦ç³»ç»ï¼å¹¶è®¾æä¼ä¸åéä¼ãè¾¾å çOMOæå¦æ¨¡å¼ï¼å ¨æ°å级ï¼çº¿ä¸çº¿ä¸äº¤äºå¦ä¹ ï¼ç´æå¦ï¼éæ¶å¦ï¼éæ¶é®ï¼åå¤å¦ï¼è®©å¦åå¦ä¹ æ´ä¾¿æ·ãæå ´è¶£çè¯ç¹å»æ¤å¤ï¼å è´¹å¦ä¹ ä¸ä¸
pythonæ¯ä»ä¹è¯è¨
åç±»:çµè/ç½ç»ç¨åºè®¾è®¡å ¶ä»ç¼ç¨è¯è¨
é®é¢æè¿°:
ä»çä¸ææ¯ä»ä¹ï¼ä»æä»ä¹ç¹ç¹
解æ:
Pythonæ¯ä»ä¹ï¼
Pythonæ¯ä¸ç§å¼æ¾æºä»£ç çèæ¬ç¼ç¨è¯è¨ï¼è¿ç§èæ¬è¯è¨ç¹å«å¼ºè°å¼åé度å代ç çæ¸ æ°ç¨åº¦ãå®å¯ä»¥ç¨æ¥å¼ååç§ç¨åºï¼ä»ç®åçèæ¬ä»»å¡å°å¤æçãé¢å对象çåºç¨ç¨åºé½æ大æ¾èº«æçå°æ¹ãPythonè¿è¢«å½ä½ä¸ç§å ¥é¨ç¨åºåæéåææ¡çä¼ç§è¯è¨ï¼å 为å®å è´¹ãé¢å对象ãæ©å±æ§å¼ºåæ¶æ§è¡ä¸¥æ ¼çç¼ç æ åã
Pythonæ¯å è´¹ç
GuidovanRossumäºå¹´å¼å§å¼åPythonï¼æåçç®çæ éæ¯ä¸ä¸ªèªå¨±ç项ç®ãä½ä¸ºMontyPythonçé£è¡é©¬æå¢èç®çç±å¥½è ï¼ä»ç»èªå·±å¼åçè¿ç§ç¼ç¨è¯è¨èµ·äºç°å¨è¿ä¸ªå¤æªçååï¼ä¸æææå°±æ¯å¤§èãPythonæå设计为ä¸ç§å代Amoebaåå¸å¼æä½ç³»ç»ABCçèæ¬è¯è¨ï¼ä½ä¸ä¹ è¿ç§æ°åç¼ç¨è¯è¨å¾å¿«å°±åå±æå¯ä»¥è§£å³ç¸å½å¤é®é¢çå©å¨ï¼ç°å¨æ´å¼å ¥å°äºå¤ç§å¹³å°ã
Guidoç®åè¿æ¯Python软件åºéä¼ç主å¸ã该ç»ç»æç §GNUå ¬å ±è®¸å¯åè®®çè¦æ±æ¥æPythonçç¥è¯äº§æå许å¯æãPythonå¯ä»¥ç¨å¨å¤ç§å¹³å°ä¸ï¼å æ¬WindowsãMacintoshååç§å¸¸è§çUNIXç³»ç»ãå¦å¤é对PalmOSå微软çPocketPCçç¸åºçæ¬ä¹å¨å¼åä¸ã
Pythonåè´¨è¶ ç¾¤
è½ç¶Python常ç¨æ¥å建ç®åçèæ¬ï¼ä½å®éç¨çç¼ç¨ææ¯å¯ä¸ç®åï¼æ¯å¦é¢å对象ç¼ç ãå¥æ¥åã线ç¨åGUIççãåå¦ä½ æ¯ä¸ä½åå ¥æµçç¨åºåï¼è¿äºç¹æ§æ¾ç¶å¯¹ä½ 太æ帮å©äºï¼å ä¸ºä½ å¯ä»¥å¾å¿«çææççç¼ç¨è¯æ³åç¼ç å®è·µï¼ä¹ååå¦ä¹ å ¶ä»è¯è¨ï¼æ¯å¦Javaæè C++çå¼å ¥çææ¯æ¦å¿µå°±å®¹æå¤äºãèæ¬å¯ä»¥åç¬æ§è¡ï¼ä¸è¿ï¼ä½ è¿å¯ä»¥éè¿ç±»æ件åå类对象类å以å åå©ç¨è¿ç§è¯è¨ç强大åè½ã
Pythonåºå«äºå ¶ä»é¢å对象è¯è¨çå ³é®æ两ç¹ãé¦å ï¼Python强è°ç©ºæ ¼åç¼ç ç»æï¼ä»è令å¼åè ç代ç å ·æè¯å¥½çéç¨æ§ãå ¶æ¬¡ï¼æ§è¡èæ¬ä¹åæ é¡»ç¼è¯Python代ç ï¼è¿å°±æ¯å®ä¸ºä»ä¹è¢«å½ä½èæ¬è¯è¨çåå ã
Pythonæäºæ©å±
Pythonè¯è¨æä¸ä¸ªå¼äººæ³¨ç®çä¼å¿ï¼å®å¯ä»¥é对è¯è¨æ æ³å®æåè½çå½æ°è°ç¨å½æ°åºãPythonè¿å ·ææäºç¸å½æç¨çå·¥å ·å¸®å©å¼ååºå¤æçåºç¨ç¨åºãå ¶ä¸æ常ç¨çå°±æ¯Tkinkerï¼è¿ç§å·¥å ·å¯ä»¥å®ç°è·¨å¹³å°çGUIå¼åãå¦ä¸ç§wxPythonå·¥å ·åæ¯å¯¹wxWindows跨平å°C++æ¡æ¶çæ©å±ãWxPythonç®åå·²ç»æ¯æWindowsåLinuxå¹³å°ãPythonImagingLibraryå¯ä»¥è®©Pythonå建ãæå¼ãç¼è¾åä¿®æ¹å¾è±¡ï¼å æ¬.gifã.jpegå.pngçã为äºäºè§£å¸¸ç¨çPythonæ©å±ååºç¨ï¼ä½ ä¸å¦¨è®¿é®ä¸The小马VaultsofParnassusã
Pythonèªèº«è¿å¯ä»¥åµå ¥å°å ¶ä»ç¼ç¨è¯è¨ä¸ãæ常è§çå°±æ¯jython/]Jythonï¼è¿æ¯ä¸ç§ç¨Javaç¼åçPython解éå¨ãè¿æ ·ä½ å°±å¯ä»¥åæ¶å©ç¨ä¸¤ç§è¯è¨çä¼ç¹ãä½ è¿å¯ä»¥å¨å¼ºå¤§çJavaåºç¨ç¨åºæ¡æ¶ä¸ç»åPythonæ¸ æ°çè¯æ³æ¥å建åºä¾èµäºä¸¤ç§è¯è¨åºçåºç¨ç¨åºã
ç¼ç æ å
ä¸¥æ ¼çPythonè¯æ³æ¯å级ç¨åºå忽ç¥è¿ä¸å¼ºå¤§ç¼ç¨è¯è¨çæ主è¦åå ãå大å¤æ°çå ¶ä»é¢åWebèæ¬è¯è¨ä¸åçæ¯ï¼Pythonç空ç½æçä¸ä¾èµäºæ¬å·æè åå·æ¥è¡¨ç¤ºè¯å¥ç»æï¼æ¢è¡åå ä½ç¬¦ç¨æ¥æ述代ç çå¯è§ç»æãè¿ç§ç¼ç¨æ¹å¼ä¹çä¹ä¸ä»¤äººæå°åç¦ï¼ä½å´å¯¹ä½ å¦æè«å¤§ç好å¤ï¼è¿å°±æ¯ä»£ç çå¯é æ§ãPythonè¿ç§ç»æåæ¯å»ºç«å¨ä¸é¢çç论ä¹ä¸ï¼å¼åè çå·¥ä½æ¶é´æ¯æºæ财产ä¸ææä»·å¼çè´¢å¯ãä¸æ¦ä½ ä¹ æ¯äºç¼åPython代ç çè§åãå®é ä¸ä½ å°±ä¹ æ¯äºä¸ç§å 建çç¼ç æ åãè¿ä¹æ£æ¯å¤§å¤æ°Pythonå¼åè æä¾èµçæ åã
è·åPython
ä½ å¯ä»¥ä»[url=python]pythonæè å类平å°ä¸çPythonçæ¬ãActiveStateç½ç«ä¹åå¸ç¨äºWindowsãLinuxåSolarisçå¹³å°çPythonåºã
æç®åçPython代ç
ä¸é¢æ们举ä¾è¯´æPythonãåè®¾ä½ ç®å使ç¨çæ¯Windowsç³»ç»ï¼èä¸å·²ç»å®è£ äºPythonï¼è¯·é¦å å¯å¨IDLEï¼ä¹å°±æ¯PythonçGUIãç°å¨å¤äºPythonShellä¸ï¼å¦æä½ å¨UNIXç±»åçç³»ç»ä¸å°±éè¦é®å ¥pythonç±»åæç¤ºä½ çPythonå¯æ§è¡æ件ï¼ãæ¥çå¨""æ示符ä¸é®å ¥ï¼
print"HelloWorld"
è¿ä¸ªå¤§å®¶è³çè½è¯¦çç¨åºå°±å¨å±å¹ä¸æ¾ç¤ºåºç»æï¼ä½ è¿å¯ä»¥å¦ä¸æ示ç»åéèµå¼ï¼
myvar=
printmyvar
å¨ä¸ä¾ä¸ä¼æ¾ç¤ºç»æã
å¦æä½ å¼åçèæ¬æ é¡»å¨PythonShellä¸ç´æ¥è¾å ¥Pythonå°±æ´æç¨äºãç¨åºæ¸ åAå°±å å«äºä¸ä¸ªHelloWorldèæ¬ç示ä¾ï¼å ¶ä¸ç¼åäºif-elseè¯å¥ã
ä½ å¯ä»¥å¨å½ä»¤è¡ä¸é®å ¥scriptname.pyæ¥æ§è¡èªå·±çèæ¬ï¼pyæ¯Pythonèæ¬çæ åæ件æ©å±åï¼ãä½ åºè¯¥è½çå°æ£ç¡®çæ¾ç¤ºç»æãæ¸ åAä¸ï¼è·çifåelseä¹åç±å ä½ç¬¦ç¼©æçè¯å¥å°±æ¯ç©ºç½æ ¼å¼åçä¸é¨åã
è¿äºå¾ç®åç示ä¾æ¼ç¤ºäºPythonæ¸ æ°çè¯æ³ã为äºäºè§£æ´å¤æå ³Pythonç¼ç¨çä¿¡æ¯ï¼ä½ ä¸å¦¨æ¥çä¸Pythonç½ç«ä¸çåå¦è æåãå¦æä½ ä¸ä¹ æ¯äºä¸ç½æµè§ï¼é£ä¹ä½ è¿å¯ä»¥é 读O'ReillyåNewRidersåºççæå ³å¾ä¹¦ãæ¯å¦HowtoThinkLikeaComputerScientist:LearningwithPythonåPythonEssentialReferenceã
å°ç»
ä¸è®ºä½ æ¯ä¸ä½åå¦ç¼ç¨è¯è¨ä»¥å¾å¢é¿èªå·±ç¥è¯æè½çå ¥é¨ç¨åºåè¿æ¯ä¸ºäºè°åæ´å¤§ä»£ç å¯é æ§çPerlé«æï¼ä½ é½ä¼åç°Pythonæ¯ä¸ç§ç¸å½çµæ´»å强大çç¼ç¨è¯è¨ãå®å¯ä»¥å¼ååºåç§åæ ·çåºç¨ç¨åºï¼ä»åè½é½å¤çé®ä»¶å表软件å°åç§è·¨å¹³å°çGUIåºç¨ç¨åºä¸åºä¿±å ¨ã
ä¸é¢ç¨å°çæ¸ åA[re:xyb]
#ListA
#(IfyouareonanUNIXtypesystemyoumayhavetomodifythefirstlinetopointto
yourPythonexecutable.)
#!/usr/bin/pythonmyvar="HelloWorld"ifmyvar=="HelloWorld":printmyvarelse:print"myvardoesnotequalHelloWorld"
[ç²¾å]å¦å¤ï¼æä¹ä»ç»ä¸æ¬ä¹¦[re:xyb]
(enthusiast)
--:
BruceEckelçThinkinginPythonï¼å¯ä»¥ä»è¿éä¸è½½ã
BruceEckelå·²ç»åºççThinkinginJavaåThinkinginC++å¯é½æ¯é¼é¼å¤§åãä»æ£å¨åçæThinkinginPythonåThinkinginPatternï¼ä¸ç¥éä»ä¹æ¶åå¯ä»¥åºçã
å ¶ä»BruceEckelçèä½ä¸è½½ç®å½ï¼BruceEckel'sFreeElectronicBooks
æç« é项ï¼
一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题
自动修改/翻新/混淆/OC/iOS代码,图片自动替换类名,马源码方法名
由来
网上有很多关于如何混淆iOS源码的小马方法,但是图片樱花内网穿透客户端源码都不够智能,生成的马源码方法类名要么千奇百怪,要么aaaabbbxxx这种完全毫无意义的小马名称,要么只能修改单个文件,图片多个文件根本无法关联,马源码我就想有什么方法可以像真人一样去修改源码,小马符合语义,图片bw源码出售不是马源码胡编烂造的方法名,还可以自动修改相关联的小马文件, 还能自己自定义单词库,于是图片就有了这个工具。
演示视频
划重点
1. 该工具可以让你一键翻新代码,但是不是生成完整的xcode项目,需要你自己新建一个xcode项目,然后把翻新的文件拖入到新的项目中。
2. 该工具只要是ipa都可以,不限制OC,Swift,Flutter,匿名社交源码React Native,H5类app。
3.目前免费使用,免费使用,免费使用,重要的事情说三遍
几个效果展示
使用说明
下载项目,官网下载:IpaGuard官网--IOS 应用程序ipa文件混淆加密保护工具注意:说明中提到的路径均为绝对路径,提到的逗号,都为英文逗号。使用工具运行成功后,需要自己新建OC项目再将修改后的代码与资源文件拖入新建的工程。功能说明:
未来可能添加的11010源码补码功能:说明文档会不定期更新,如遇到问题先检查是否依照说明文档的定义进行配置。
1. 源文件路径/import_path(必选)
OC项目文件路径包含代码文件与资源文件
如下图
2. 导出路径/export_path(必选)
OC项目导出路径。
注意,本工具并不能帮你生成完整的OC项目,只会生成OC代码文件和复制修改项目内部的资源
3. 直接复制的路径/copy_only_pathes(可选)
直接复制,忽略的文件名,多个路径以,逗号隔开
4. 直接复制的文件名(不包含后缀)/copy_only_names(可选)
直接复制,忽略的文件名,不包含后缀
例:UISheetView.h 只需要输入UISheetView,多个文件用, 逗号隔开(注意全半角,逗号为英文逗号)
5. 不进行修改的代码源码安装文件或文件夹/no_change_pathes(可选)
深度读取,但是不会进行更改,如果引入了其他修改了的类,会相应的修改深度读取(说明):会读取文件内部的类比与项目内其他类进行关联例:xxxx/Classes/Models 不想修改,则输入这个文件夹的绝对路径, 如只输入Models,则所有包含名为Models的文件或文件夹都会标记为只读取不修改,多个文件和类用, 逗号隔开(注意全半角,逗号为英文逗号)
6. 不修改的文件或类的前缀名(区分大小写)/no_change_class_prefix_names(可选)
例:不想所有以MJ开头的类或文件,则输入MJ, 多个文件和类用,逗号隔开(注意全半角,逗号为英文逗号)
7. 不修改的文件后缀名(区分大小写)/no_change_class_prefix_names(可选)
如第六条。Model,Info -->不修改以Model,Info为结尾的文件或类
8. 只修改类名的文件名或类名/only_change_clsname_names(可选)
深度读取,只修改类名,不修改内部属性与方法,这个优先级最低,如果之前的条件包含了本参数中的路径,则不生效
9. 只修改类名的文件夹/文件路径/only_change_clsname_pathes(可选)
深度读取,只修改类名,不修改内部属性与方法的文件名,这个优先级最低,如果之前的条件包含了本参数中的路径 则不生效
. 动词词库路径/verbwords_path(可选)
提供单词数组json文件路径 修改的命名逻辑为ABAB型,A为动词,B为名词,例:getMessage
. 名词词库路径/nounwords_path(可选)
提供单词数组json文件路径 修改的命名逻辑为ABAB型,A为动词,B为名词,例:getMessage
. 类名前缀/class_prefix(可选)
给每个类添加的前缀例:MJExtension-> MJ 为前缀, SD_ScrollView-> SD_ 为前缀
. 属性名前缀/property_prefix(可选)
给每个属性添加的前缀例:property(nonatomic, strong) UIViewMJView-> MJ 为前缀, property(nonatomic, strong) UIView SD_View-> SD_ 为前缀
. 需要过滤的方法路径/filter_methods_path(可选)
把你需要过滤的方法写入一个文本文件,然后将该文本路径填入到此项输入框注意事项:其他说明:本工具已经过滤了大多数常用系统方法,大部分情况下不需要配置此项。
. 类名和属性名后缀路径/property_subfix_path(可选)
给每个属性添加的后缀,需要一个配置json文件路径json格式:注意:key一定要与上面一直,否则系统无法读取,工具会遍历数组,为对应的类匹配后缀,在配置改文件时,包含相同字符串的类,需要将类名更长的类放在前面,不然匹配结果会达不到预期。例如:UITableView与UIView,配置时需要将UITableView放在View之前,如上面的例子。
. 为方法名添加介词/add_preposition(可选)
工具内置了所有介词,可选择性添加例:getMessage添加介词后-> getAMessage or getTheMessage具体介词完全随机添加
. 修改分类/change_category(可选)
工具会自动识别分类,可选择是否修改
. 将原代码行作为注释写入/add_original_comments(可选)
由于本工具不保证修改后百分百不报错,将修改过原属性声明和方法名作为注释写入,方便在重建工程后报错与原工程进行对照,建议设置
. 修改方法内部局部变量名/change_local_property(可选)
定义在方法内部的局部变量,可选择是否修改
. 综合配置路径(可选)
json配置文件路径,内部必须为字典,key为说明条目标题后面的英文请注意:配置文件优先级高于输入框输入的规则,配置文件存在时, 输入框输入的配置不生效例:(可直接复制修改)
关于bug
虽然工具本身经过了完整的商业项目的考验,但由于每个人的代码风格不一样,工具不可避免会出现解析不了的情况,开发者建议过滤C语言的文件,与第三方库,减少出错的可能性,还是无法运行成功,你可以发isssue至客服邮箱或根据报错Log自行删减项目文件,其中利弊,自行斟酌。
å¦ä½å¨vueä¸ä½¿ç¨tsç示ä¾ä»£ç
æ¬æä»ç»äºå¦ä½å¨vueä¸ä½¿ç¨tsç示ä¾ä»£ç ï¼å享ç»å¤§å®¶ï¼å ·ä½å¦ä¸ï¼
注æï¼æ¤æ并ä¸æ¯ævueæ¹ä¸ºå ¨é¨æ¿æ¢ä¸ºtsï¼èæ¯å¯ä»¥å¨åæ¥ç项ç®ä¸æ¤å ¥tsæ件ï¼ç®ååªæ¯å®è·µé¶æ®µï¼åts转åè¿ç¨ä¸çè¿æ¸¡ã
tsæä»ä¹ç¨ï¼
ç±»åæ£æ¥ãç´æ¥ç¼è¯å°åçjsãå¼å ¥æ°çè¯æ³ç³
为ä»ä¹ç¨tsï¼
TypeScriptç设计ç®çåºè¯¥æ¯è§£å³JavaScriptçâçç¹âï¼å¼±ç±»åå没æå½å空é´ï¼å¯¼è´å¾é¾æ¨¡ååï¼ä¸éåå¼å大åç¨åºãå¦å¤å®è¿æä¾äºä¸äºè¯æ³ç³æ¥å¸®å©å¤§å®¶æ´æ¹ä¾¿å°å®è·µé¢å对象çç¼ç¨ã
typescriptä¸ä» å¯ä»¥çº¦ææ们çç¼ç ä¹ æ¯ï¼è¿è½èµ·å°æ³¨éçä½ç¨ï¼å½æ们çå°ä¸å½æ°åæ们ç«é©¬å°±è½ç¥éè¿ä¸ªå½æ°çç¨æ³ï¼éè¦ä¼ ä»ä¹å¼ï¼è¿åå¼æ¯ä»ä¹ç±»åä¸ç®äºç¶ï¼å¯¹å¤§å项ç®çç»´æ¤æ§æå¾å¤§çæåãä¹ä¸è³äºä½¿å¼åè æ¬èµ·ç³å¤´ç ¸èªå·±çèã
Angular: æ们为ä»ä¹éæ©TypeScript?
TypeScript éä¼ç§çå·¥å ·
TypeScript æ¯ JavaScript çè¶ é
TypeScript 使å¾æ½è±¡æ¸ æ°å¯è§
TypeScript 使代ç æ´å®¹æé 读åç解
æ¯çï¼æç¥éè¿çèµ·æ¥å¹¶ä¸ç´è§ã让æç¨ä¸ä¸ªä¾åæ¥è¯´ææçææã让æ们æ¥ççè¿ä¸ªå½æ°jQuery.ajax()ãæ们è½ä»å®çç¾åä¸å¾å°ä»ä¹ä¿¡æ¯?
æ们å¯ä¸è½ç¡®å®çæ¯è¿ä¸ªå½æ°æ两个åæ°ãæ们å¯ä»¥çæµè¿äºç±»åãä¹è®¸ç¬¬ä¸ä¸ªæ¯å符串ï¼ç¬¬äºä¸ªæ¯é 置对象ãä½è¿åªæ¯çæµï¼æ们å¯è½éäºãæ们ä¸ç¥éä»ä¹é项è¿å ¥è®¾ç½®å¯¹è±¡(å®ä»¬çå称åç±»å)ï¼æè 该å½æ°è¿åä»ä¹ã
å¨ä¸æ£æ¥æºä»£ç æææ¡£çæ åµä¸ï¼æ们ä¸å¯è½è°ç¨è¿ä¸ªå½æ°ãæ£æ¥æºä»£ç 并ä¸æ¯ä¸ä¸ªå¥½çéæ©ââæ¥æå½æ°åç±»çç®çï¼æ¯å¨ä¸ç¥éå¦ä½å®ç°å®ä»¬çæ åµä¸ä½¿ç¨å®ä»¬ãæ¢å¥è¯è¯´ï¼æ们åºè¯¥ä¾èµäºä»ä»¬çæ¥å£ï¼èä¸æ¯ä»ä»¬çå®ç°ãæ们å¯ä»¥æ£æ¥ææ¡£ï¼ä½è¿å¹¶ä¸æ¯æ好çå¼åç»éªââå®éè¦é¢å¤çæ¶é´ï¼èä¸ææ¡£ç»å¸¸è¿æã
å æ¤ï¼å°½ç®¡å¾å®¹æé 读jQuery.ajax(url,settings)ï¼çæ£ç解å¦ä½è°ç¨è¿ä¸ªå½æ°ï¼æ们éè¦é 读å®çå®ç°æå®çææ¡£ã
以ä¸æ¯ä¸ä¸ªç±»åçæ¬ï¼
å®ç»äºæ们æ´å¤çä¿¡æ¯ã
è¿ä¸ªå½æ°ç第ä¸ä¸ªåæ°æ¯ä¸ä¸ªå符串ã
设置åæ°æ¯å¯éçãæ们å¯ä»¥çå°ææå¯ä»¥ä¼ éå°å½æ°ä¸çé项ï¼ä¸ä» æ¯å®ä»¬çå称ï¼è¿å æ¬å®ä»¬çç±»åã
å½æ°è¿åä¸ä¸ªJQueryXHR对象ï¼æ们å¯ä»¥çå°å®çå±æ§åå½æ°ã
ç±»ååç¾åè¯å®æ¯æªç±»ååçç¾åé¿ï¼ä½æ¯:stringï¼:JQueryAjaxSettingsåJQueryXHR并ä¸æ¯æ··ä¹±çã å®ä»¬æ¯æé«ä»£ç çå¯ç解æ§çéè¦ææ¡£ãæ们å¯ä»¥æ´æ·±å ¥å°ç解代ç ï¼èä¸å¿ æ·±å ¥å°å®ç°æ读åææ¡£ä¸ã æç个人ç»éªæ¯ï¼æå¯ä»¥æ´å¿«å°é 读类åå代ç ï¼å 为类åæä¾äºæ´å¤çä¸ä¸ææ¥ç解代ç ã
æèª Angular: æ们为ä»ä¹éæ©TypeScript?
ts好å¦åï¼
TypeScriptçä¸ä¸ªè®¾è®¡äº®ç¹å°±æ¯å®å¹¶æ²¡ææå¼JavaScriptçè¯æ³å¦èµ·çç¶ï¼èæ¯åæäºJavaScriptçè¶ éï¼è¿ä¸ªåå³åºè¯¥è®°å¨Andersä¸ï¼ï¼è¿æ ·ä»»ä½åæ³çJavaScriptçè¯å¥å¨TypeScriptä¸é½æ¯åæ³çï¼ä¹å°±æ¯è¯´å¦ä¹ ææ¬å¾ä½ï¼å¦æä½ å¯¹JavaScriptææ¯è¾æ·±å ¥çäºè§£ï¼é£ä¹å ¶å®å¯ä»¥å¾å¿«çä¸æTypeScriptï¼å 为å®ç设计é½æ¯é对JavaScriptç使ç¨ä¹ æ¯åæ¯ä¾ã
ä¸äºç®åçä¾åï¼ä¸çå³æï¼
åºç¡ç±»å
let isDone: boolean = false; // å¸å°å¼
let decLiteral: number = 6; // æ°å
let name: string = "bob"; // å符串
let list: number[] = [1, 2, 3]; // æ°ç»
...
...
æ¥å£
function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label);
} let myObj = { size: , label: "Size Object" };
printLabel(myObj);
ç±»åæ£æ¥å¨ä¼æ¥çprintLabelçè°ç¨ã printLabelæä¸ä¸ªåæ°ï¼å¹¶è¦æ±è¿ä¸ªå¯¹è±¡åæ°æä¸ä¸ªå为labelç±»å为stringçå±æ§ã éè¦æ³¨æçæ¯ï¼æä»¬ä¼ å ¥ç对象åæ°å®é ä¸ä¼å å«å¾å¤å±æ§ï¼ä½æ¯ç¼è¯å¨åªä¼æ£æ¥é£äºå¿ éçå±æ§æ¯å¦åå¨ï¼å¹¶ä¸å ¶ç±»åæ¯å¦å¹é ã
å½ç¶è¿æä¸äºé«çº§çç¨æ³ï¼è¿éå°±ä¸åè¿å¤çä»ç»äºï¼äºè§£æ´å¤
å¦ä½å¨vue项ç®ä¸åºç¨tsï¼
1ãé¦å å®è£ ts
npm install --save-dev typescript npm install --save-dev ts-loader
2ãå¨æ ¹ç®å½å»ºtsconfig.jsonæ件
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"lib": ["dom","es"],
"target": "es5"
},
"include": ["./src/**/*"] }
3ãå¨é ç½®ä¸æ·»å ts-loader
{
test: /\.tsx?$/,
loader: 'ts-loader', exclude: /node_modules/, options: {
appendTsSuffixTo: [/\.vue$/],
}
}
4ãæåæ .ts åç¼æ·»å ä¸å°±OKäºï¼å¨webpack.base.conf.jsæ件ä¸
ç°å¨å°±å¯ä»¥å¨æ们åæ¬ç项ç®ä¸ä½¿ç¨tsæ件äºã
å¦ä½å®è·µï¼
1ãå¦ä½å¨jsä¸å¼ç¨tsæ件ï¼
ç±äºjsæ件没æç±»åæ£æµï¼å½æ们ætsæ件å¼å ¥çæ¶åï¼tsæ件ä¼è½¬åæjsæ件ï¼æ以å¨jsæ件ä¸å¼ç¨tsæ件çæ¹æ³ç±»åæ£æµæºå¶ä¸ä¼çæãä¹å°±æ¯è¯´åªæå¨tsæ件å æä¼æç±»åæ£æµæºå¶ã
é£ä¹æä¹å¨jsæ件ä¸ä½¿ç¨ç±»åæ£æµæºå¶å¢ï¼å°ç¼èªå·±å°è£ äºä¸å¥typeCheckçdecoratoræ¹æ³ï¼ä» ä¾åèï¼ç¨æ³å¦ä¸ï¼
@typeCheck('object','number') deleteItem(item,index) { }
æ£æµdeleteItemæ¹æ³åæ°ï¼ item为objectç±»åï¼index为numberç±»åï¼å¦æç±»åä¸å¹é å°ä¼æåºå¼å¸¸
é¨å代ç ç®ä¸ï¼
const _check = function (checked,checker) {
check: for(let i = 0; i < checked.length; i++) { if(/(any)/ig.test(checker[i])) continue check; if(_isPlainObject(checked[i]) && /(object)/ig.test(checker[i])) continue check; if(_isRegExp(checked[i]) && /(regexp)/ig.test(checker[i])) continue check; if(Array.isArray(checked[i]) && /(array)/ig.test(checker[i])) continue check; let type = typeof checked[i]; let checkReg = new RegExp(type,'ig') if(!checkReg.test(checker[i])) { console.error(checked[i] + 'is not a ' + checker[i]); return false;
}
} return true;
} /
*** @description æ£æµç±»å
* 1.ç¨äºæ ¡æ£å½æ°åæ°çç±»åï¼å¦æç±»åé误ï¼ä¼æå°é误并ä¸åæ§è¡è¯¥å½æ°ï¼
* 2.ç±»åæ£æµå¿½ç¥å¤§å°åï¼å¦stringåStringé½å¯ä»¥è¯å«ä¸ºå符串类åï¼
* 3.å¢å anyç±»åï¼è¡¨ç¤ºä»»ä½ç±»ååå¯æ£æµéè¿ï¼
* 4.å¯æ£æµå¤ä¸ªç±»åï¼å¦ "number array",两è åå¯æ£æµéè¿ãæ£åæ£æµå¿½ç¥è¿æ¥ç¬¦ ï¼
*/
export function typeCheck() { const checker = Array.prototype.slice.apply(arguments); return function (target, funcName, descriptor) { let oriFunc = descriptor.value;
descriptor.value = function () { let checked = Array.prototype.slice.apply(arguments); let result = undefined; if(_check(checked,checker) ){
result = oriFunc.call(this,...arguments);
} return result;
}
}
};
tsçç±»åæ£æµé åtypeCheckåºæ¬ä¸å·²ç»æ»¡è¶³äºæ们çéè¦ã
2ãå¦ä½å¨tsä¸å¼ç¨jsæ件ï¼
ç±äºjsæ件ä¸æ²¡æç±»åæ£æµï¼æ以tsæ件å¼å ¥jsæ件æ¶ä¼è½¬å为anyç±»åï¼å½ç¶æ们ä¹å¯ä»¥å¨ .d.tsæ件ä¸å£°æç±»åã
å¦ global.d.ts æ件
å½ç¶æçæ¶åæ们éè¦ä½¿ç¨ä¸äºåºï¼ç¶è并没æ声ææ件ï¼é£ä¹æ们å¨tsæ件ä¸å¼ç¨çæ¶åå°±ä¼æ¯undefinedãè¿ä¸ªæ¶åæ们åºè¯¥æä¹åï¼
æ¯å¦ææ³è¦å¨util.tsæ件ä¸ç¨ âquery-string'çæ¶åæ们就ä¼è¿æ ·å¼ç¨ï¼
import querystring from 'query-string';
ç¶èå½ä½ æå°querystring çæ¶åæ¯undefinedãå¦ä½è§£å³å¢ï¼å°ç¼çæ¹æ³ä¹ä» ä¾åè
æ°å»ºmodule.jsæ件
import querystring from 'query-string'; export const qs = querystring;
utile.ts æ件
import { qs } from './module.js';
解å³äºãæå°qsä¸åæ¯undefinedï¼å¯ä»¥æ£å¸¸ä½¿ç¨qsåºäºå¦ã
è³æ¤æ¬æå°±å°tså¨vueä¸çé ç½®ä»ç»ç»æï¼æ¤æåªä»£è¡¨ä¸ªäººçæ³ï¼èèå°é¡¹ç®çæ©å±æ§ï¼æ以没æå ¨é¨æ¿æ¢ætsï¼åªæ¯å°è¯æ§å¨vueä¸å¼å ¥tsï¼è¿æå¾å¤éè¦æ¹è¿çå°æ¹ï¼å¦æææ´å¥½ç建议åæè§å¯ä»¥èç³»æï¼