iOS中謂詞(NSPredicate)的基本入門使用教程
前言
首先,我們需要知道何謂謂詞,讓我們看看官方的解釋:
The NSPredicate class is used to define logical conditions used to constrain a search either for a fetch or for in-memory filtering.
NSPredicate類是用來(lái)定義邏輯條件約束的獲取或內(nèi)存中的過(guò)濾搜索。
可以使用謂詞來(lái)表示邏輯條件,用于描述對(duì)象持久性存儲(chǔ)在內(nèi)存中的對(duì)象過(guò)濾。其實(shí)意思就是:我是一個(gè)過(guò)濾器,不符合條件的都滾開。
一、NSPredicate的基本語(yǔ)法
我們使用一門語(yǔ)言,無(wú)論是外語(yǔ)還是計(jì)算機(jī)語(yǔ)言,總是從語(yǔ)法開始的,這樣我們才能正確的把握邏輯。所以我們從語(yǔ)法開始說(shuō)起。在這部分我們僅關(guān)心其語(yǔ)法的使用
只要我們使用謂詞(NSPredicate)都需要為謂詞定義謂詞表達(dá)式,而這個(gè)表達(dá)式必須是一個(gè)返回BOOL的值。
謂詞表達(dá)式由表達(dá)式、運(yùn)算符和值構(gòu)成。
1.比較運(yùn)算符
比較運(yùn)算符如下
=、==:判斷兩個(gè)表達(dá)式是否相等,在謂詞中=和==是相同的意思都是判斷,而沒有賦值這一說(shuō)
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = 123"];
if ([predicate evaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
}
我們可以看到輸出的內(nèi)容為:
2016-01-07 11:12:27.281 PredicteDemo[4130:80412] testString:123
- >=,=>:判斷左邊表達(dá)式的值是否大于或等于右邊表達(dá)式的值
- <=,=<:判斷左邊表達(dá)式的值是否小于或等于右邊表達(dá)式的值
- >:判斷左邊表達(dá)式的值是否大于右邊表達(dá)式的值
- <:判斷左邊表達(dá)式的值是否小于右邊表達(dá)式的值
- !=、<>:判斷兩個(gè)表達(dá)式是否不相等
- BETWEEN:BETWEEN表達(dá)式必須滿足表達(dá)式 BETWEEN {下限,上限}的格式,要求該表達(dá)式必須大于或等于下限,并小于或等于上限
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"];
if ([predicate evaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
} else {
NSLog(@"不符合條件");
}
輸出結(jié)果為:
2016-01-07 11:20:39.921 PredicteDemo[4366:85408] testString:123
2.邏輯運(yùn)算符
AND、&&:邏輯與,要求兩個(gè)表達(dá)式的值都為YES時(shí),結(jié)果才為YES。
NSArray *testArray = @[@1, @2, @3, @4, @5, @6]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"]; NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate]; NSLog(@"filterArray:%@", filterArray);
輸出結(jié)果為:
2016-01-07 11:27:01.885 PredicteDemo[4531:89537] filterArray:(
3,
4
)
- OR、||:邏輯或,要求其中一個(gè)表達(dá)式為YES時(shí),結(jié)果就是YES
- NOT、 !:邏輯非,對(duì)原有的表達(dá)式取反
3.字符串比較運(yùn)算符
- BEGINSWITH:檢查某個(gè)字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')
- ENDSWITH:檢查某個(gè)字符串是否以指定的字符串結(jié)尾
- CONTAINS:檢查某個(gè)字符串是否包含指定的字符串
- LIKE:檢查某個(gè)字符串是否匹配指定的字符串模板。其之后可以跟?代表一個(gè)字符和*代表任意多個(gè)字符兩個(gè)通配符。比如"name LIKE '*ac*'",這表示name的值中包含ac則返回YES;"name LIKE '?ac*'",表示name的第2、3個(gè)字符為ac時(shí)返回YES。
- MATCHES:檢查某個(gè)字符串是否匹配指定的正則表達(dá)式。雖然正則表達(dá)式的執(zhí)行效率是最低的,但其功能是最強(qiáng)大的,也是我們最常用的。
注:字符串比較都是區(qū)分大小寫和重音符號(hào)的。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運(yùn)算不區(qū)分大小寫和重音符號(hào),請(qǐng)?jiān)谶@些運(yùn)算符后使用[c],[d]選項(xiàng)。其中[c]是不區(qū)分大小寫,[d]是不區(qū)分重音符號(hào),其寫在字符串比較運(yùn)算符之后,比如:name LIKE[cd] 'cafe',那么不論name是cafe、Cafe還是café上面的表達(dá)式都會(huì)返回YES。
4.集合運(yùn)算符
- ANY、SOME:集合中任意一個(gè)元素滿足條件,就返回YES。
- ALL:集合中所有元素都滿足條件,才返回YES。
- NONE:集合中沒有任何元素滿足條件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18時(shí),才返回YES。
- IN:等價(jià)于SQL語(yǔ)句中的IN運(yùn)算符,只有當(dāng)左邊表達(dá)式或值出現(xiàn)在右邊的集合中才會(huì)返回YES。我們通過(guò)一個(gè)例子來(lái)看一下
NSArray *filterArray = @[@"ab", @"abc"]; NSArray *array = @[@"a", @"ab", @"abc", @"abcd"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray]; NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
代碼的作用是將array中和filterArray中相同的元素去除,輸出為:
2016-01-07 13:17:43.669 PredicteDemo[6701:136206] (
a,
abcd
)
- array[index]:返回array數(shù)組中index索引處的元素
- array[FIRST]:返回array數(shù)組中第一個(gè)元素
- array[LAST]:返回array數(shù)組中最后一個(gè)元素
- array[SIZE]:返回array數(shù)組中元素的個(gè)數(shù)
5.直接量
在謂詞表達(dá)式中可以使用如下直接量
- FALSE、NO:代表邏輯假
- TRUE、YES:代表邏輯真
- NULL、NIL:代表空值
- SELF:代表正在被判斷的對(duì)象自身
- "string"或'string':代表字符串
- 數(shù)組:和c中的寫法相同,如:{'one', 'two', 'three'}。
- 數(shù)值:包括證書、小數(shù)和科學(xué)計(jì)數(shù)法表示的形式
- 十六進(jìn)制數(shù):0x開頭的數(shù)字
- 八進(jìn)制:0o開頭的數(shù)字
- 二進(jìn)制:0b開頭的數(shù)字
6.保留字
下列單詞都是保留字(不論大小寫)
AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE
注:雖然大小寫都可以,但是更推薦使用大寫來(lái)表示這些保留字
二、謂詞的用法
1.定義謂詞
一般我們使用下列方法來(lái)定義一個(gè)謂詞
NSPredicate *predicate = [NSPredicate predicateWithFormat:<#(nonnull NSString *), ...#>];
下面我們通過(guò)幾個(gè)簡(jiǎn)單的例子來(lái)看看它該如何使用:
首先我們需要定義一個(gè)模型,因?yàn)槭纠行枰玫剿?br />
ZLPersonModel.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ZLPersonSex) {
ZLPersonSexMale = 0,
ZLPersonSexFamale
};
@interface ZLPersonModel : NSObject
/** NSString 姓名 */
@property (nonatomic, copy) NSString *name;
/** NSUInteger 年齡 */
@property (nonatomic, assign, readonly) NSUInteger age;
/** ZLPersonSex 性別 */
@property (nonatomic, assign, readonly) ZLPersonSex sex;
+ (instancetype)personWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex;
@end
ZLPersonModel.m
#import "ZLPersonModel.h"
@implementation ZLPersonModel
- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex
{
if (self = [super init]) {
_name = name;
_age = age;
_sex = sex;
}
return self;
}
+ (instancetype)personWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex
{
return [[self alloc] initWithName:name age:age sex:sex];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"[name = %@, age = %ld, sex = %ld]", self.name, self.age, self.sex];
}
@end
下面讓我們進(jìn)入正題
例一:(最簡(jiǎn)單的使用)
ZLPersonModel *sunnyzl = [ZLPersonModel personWithName:@"sunnyzl" age:29 sex:ZLPersonSexMale]; ZLPersonModel *jack = [ZLPersonModel personWithName:@"jack" age:22 sex:ZLPersonSexMale]; // 首先我們來(lái)看一些簡(jiǎn)單的使用 // 1.判斷姓名是否是以s開頭的 NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"name LIKE 's*'"]; // 輸出為:sunnyzl:1, jack:0 NSLog(@"sunnyzl:%d, jack:%d", [pred1 evaluateWithObject:sunnyzl], [pred1 evaluateWithObject:jack]); // 2.判斷年齡是否大于25 NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"age > 25"]; // 輸出為:sunnyzl的年齡是否大于25:1, jack的年齡是否大于25:0 NSLog(@"sunnyzl的年齡是否大于25:%d, jack的年齡是否大于25:%d", [pred2 evaluateWithObject:sunnyzl], [pred2 evaluateWithObject:jack]);
看到這里我們會(huì)發(fā)現(xiàn)evaluateWithObject:方法返回的是一個(gè)BOOL值,如果符合條件就返回YES,不符合就返回NO。而即使是最簡(jiǎn)單的使用也有一些大用處,比如以前我們寫判斷手機(jī)號(hào)碼、郵編等等,像我就喜歡用John Engelhart大神的RegexKitLite,然而由于年代久遠(yuǎn)需要導(dǎo)入libicucore.dylib庫(kù)(xcode7為libicucore.tbd)且由于是mrc又需要添加-fno-objc-arc,至此我們才能使用。然而使用謂詞讓我們可以用同樣簡(jiǎn)潔的代碼實(shí)現(xiàn)相同的功能
例二:
(判斷手機(jī)號(hào)是否正確)
- (BOOL)checkPhoneNumber:(NSString *)phoneNumber
{
NSString *regex = @"^[1][3-8]\\d{9}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:phoneNumber];
}
例三:檢測(cè)字符串中是否有特殊字符
- (BOOL)checkSpecialCharacter:(NSString *)string
{
NSString *regex = @"[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:string];
}
2.使用謂詞過(guò)濾集合
此部分是我們需要掌握的重點(diǎn),因?yàn)閺倪@里我們就可以看到謂詞的真正的強(qiáng)大之處
其實(shí)謂詞本身就代表了一個(gè)邏輯條件,計(jì)算謂詞之后返回的結(jié)果永遠(yuǎn)為BOOL類型的值。而謂詞最常用的功能就是對(duì)集合進(jìn)行過(guò)濾。當(dāng)程序使用謂詞對(duì)集合元素進(jìn)行過(guò)濾時(shí),程序會(huì)自動(dòng)遍歷其元素,并根據(jù)集合元素來(lái)計(jì)算謂詞的值,當(dāng)這個(gè)集合中的元素計(jì)算謂詞并返回YES時(shí),這個(gè)元素才會(huì)被保留下來(lái)。請(qǐng)注意程序會(huì)自動(dòng)遍歷其元素,它會(huì)將自動(dòng)遍歷過(guò)之后返回為YES的值重新組合成一個(gè)集合返回。
其實(shí)類似于我們使用tableView設(shè)置索引時(shí)使用的下段代碼
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return [self.cityGroup valueForKey:@"title"];
}
中的[self.cityGroup valueForKey:@"title"]。它的作用是遍歷所有title并將得到的值組成新的數(shù)組。
- NSArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過(guò)濾NSArray集合,返回符合條件的元素組成的新集合 - NSMutableArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過(guò)濾NSMutableArray,剔除集合中不符合條件的元素 - NSSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
- (NSSet<ObjectType> *)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法 - NSMutableSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSMutableArray中的方法。
通過(guò)上面的描述可以看出,使用謂詞過(guò)濾不可變集合和可變集合的區(qū)別是:過(guò)濾不可變集合時(shí),會(huì)返回符合條件的集合元素組成的新集合;過(guò)濾可變集合時(shí),沒有返回值,會(huì)直接剔除不符合條件的集合元素
下面讓我們來(lái)看幾個(gè)例子:
例一:
NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
// 過(guò)濾大于50的值
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
[arrayM filterUsingPredicate:pred1];
NSLog(@"arrayM:%@", arrayM);
NSArray *array = @[[ZLPersonModel personWithName:@"Jack" age:20 sex:ZLPersonSexMale],
[ZLPersonModel personWithName:@"Rose" age:22 sex:ZLPersonSexFamale],
[ZLPersonModel personWithName:@"Jackson" age:30 sex:ZLPersonSexMale],
[ZLPersonModel personWithName:@"Johnson" age:35 sex:ZLPersonSexMale]];
// 要求取出包含‘son'的元素
NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"name CONTAINS 'son'"];
NSArray *newArray = [array filteredArrayUsingPredicate:pred2];
NSLog(@"%@", newArray);
輸出為
2016-01-07 16:50:09.510 PredicteDemo[13660:293822] arrayM:(
60,
70
)
2016-01-07 16:50:09.511 PredicteDemo[13660:293822] (
"[name = Jackson, age = 30, sex = 0]",
"[name = Johnson, age = 35, sex = 0]"
)
從這個(gè)例子我們就可以看到NSPredicate有多么強(qiáng)大,如果讓我們用其他的方法來(lái)實(shí)現(xiàn)又是一大堆if...else。
讓我們來(lái)回顧一下上面的從第二個(gè)數(shù)組中去除第一個(gè)數(shù)組中相同的元素
例二:
NSArray *filterArray = @[@"ab", @"abc"]; NSArray *array = @[@"a", @"ab", @"abc", @"abcd"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray]; NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
輸出為:
2016-01-07 13:17:43.669 PredicteDemo[6701:136206] (
a,
abcd
)
如果我們不用NSPredicate的話,肯定又是各種if...else,for循環(huán)等等??梢钥闯鯪SPredicate的出現(xiàn)為我們節(jié)省了大量的時(shí)間和精力。
3.在謂詞中使用占位符參數(shù)
我們上面所有的例子中謂詞總是固定的,然而我們?cè)诂F(xiàn)實(shí)中處理變量時(shí)決定了謂詞應(yīng)該是可變的。下面我們來(lái)看看如果讓謂詞變化起來(lái)。
首先如果我們想在謂詞表達(dá)式中使用變量,那么我們需要了解下列兩種占位符
- %K:用于動(dòng)態(tài)傳入屬性名
- %@:用于動(dòng)態(tài)設(shè)置屬性值
其實(shí)相當(dāng)于變量名與變量值
除此之外,還可以在謂詞表達(dá)式中使用動(dòng)態(tài)改變的屬性值,就像環(huán)境變量一樣
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS $VALUE"];
上述表達(dá)式中,開頭,隨著程序改變$VALUE這個(gè)謂詞表達(dá)式的比較條件就可以動(dòng)態(tài)改變。
下面我們通過(guò)一個(gè)例子來(lái)看看這三個(gè)重要的占位符應(yīng)該如何使用
例一:
NSArray *array = @[[ZLPersonModel personWithName:@"Jack" age:20 sex:ZLPersonSexMale],
[ZLPersonModel personWithName:@"Rose" age:22 sex:ZLPersonSexFamale],
[ZLPersonModel personWithName:@"Jackson" age:30 sex:ZLPersonSexMale],
[ZLPersonModel personWithName:@"Johnson" age:35 sex:ZLPersonSexMale]];
// 定義一個(gè)property來(lái)存放屬性名,定義一個(gè)value來(lái)存放值
NSString *property = @"name";
NSString *value = @"Jack";
// 該謂詞的作用是如果元素中property屬性含有值value時(shí)就取出放入新的數(shù)組內(nèi),這里是name包含Jack
NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", property, value];
NSArray *newArray = [array filteredArrayUsingPredicate:pred];
NSLog(@"newArray:%@", newArray);
// 創(chuàng)建謂詞,屬性名改為age,要求這個(gè)age包含$VALUE字符串
NSPredicate *predTemp = [NSPredicate predicateWithFormat:@"%K > $VALUE", @"age"];
// 指定$VALUE的值為 25
NSPredicate *pred1 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE" : @25}];
NSArray *newArray1 = [array filteredArrayUsingPredicate:pred1];
NSLog(@"newArray1:%@", newArray1);
// 修改 $VALUE的值為32
NSPredicate *pred2 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE" : @32}];
NSArray *newArray2 = [array filteredArrayUsingPredicate:pred2];
NSLog(@"newArray2:%@", newArray2);
輸出為
2016-01-07 17:28:02.062 PredicteDemo[14542:309494] newArray:(
"[name = Jack, age = 20, sex = 0]",
"[name = Jackson, age = 30, sex = 0]"
)
2016-01-07 17:28:02.063 PredicteDemo[14542:309494] newArray1:(
"[name = Jackson, age = 30, sex = 0]",
"[name = Johnson, age = 35, sex = 0]"
)
2016-01-07 17:28:02.063 PredicteDemo[14542:309494] newArray2:(
"[name = Johnson, age = 35, sex = 0]"
)
從上例中我們主要可以看出來(lái)%K和$VALUE的含義。
那么至此NSPredicate就到到此介紹完畢。
因?yàn)楸救怂接邢?,如果有什么好的建議請(qǐng)聯(lián)系我。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Java Predicate及Consumer接口函數(shù)代碼實(shí)現(xiàn)解析
- SpringCloud Gateway加載斷言predicates與過(guò)濾器filters的源碼分析
- C#中的Action、Func和Predicate如何使用
- iOS中NSPredicate謂詞的使用
- 30分鐘快速帶你理解iOS中的謂詞NSPredicate
- IOS中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別
- C#中Predicate<T>與Func<T, bool>泛型委托的用法實(shí)例
- 淺談Java8新特性Predicate接口
相關(guān)文章
iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05
使用UItableview在iOS應(yīng)用開發(fā)中實(shí)現(xiàn)好友列表功能
這篇文章主要介紹了使用UItableview在iOS應(yīng)用開發(fā)中實(shí)現(xiàn)一個(gè)好友列表功能的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12
iOS使用自帶的UIViewController實(shí)現(xiàn)qq加號(hào)下拉菜單的功能(實(shí)例代碼)
這篇文章主要介紹了iOS使用自帶的UIViewController實(shí)現(xiàn)qq加號(hào)下拉菜單的功能(實(shí)例代碼),需要的朋友可以參考下2017-05-05
iOS使用WebView生成長(zhǎng)截圖的第3種解決方案
這篇文章主要給大家介紹了關(guān)于iOS使用WebView生成長(zhǎng)截圖的第3種解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
詳解iOS中UIView的layoutSubviews子視圖布局方法使用
這篇文章主要介紹了iOS中UIView的layoutSubviews子視圖布局方法使用,文中舉了一個(gè)layoutSubviews在iPad橫豎屏切換時(shí)被調(diào)用用來(lái)重新布局的實(shí)例,需要的朋友可以參考下2016-04-04
在iOS應(yīng)用中使用UIWebView創(chuàng)建簡(jiǎn)單的網(wǎng)頁(yè)瀏覽器界面
這篇文章主要介紹了在iOS應(yīng)用中使用UIWebView創(chuàng)建簡(jiǎn)單的網(wǎng)頁(yè)瀏覽器界面的方法,包括動(dòng)態(tài)獲取UIWebView高度的實(shí)現(xiàn),需要的朋友可以參考下2016-01-01
iOS簡(jiǎn)單易用的GCD計(jì)時(shí)器的實(shí)現(xiàn)原理
在日常開發(fā)中總會(huì)碰到需要計(jì)時(shí)器的功能,常見的定時(shí)器有NSTimer、GCD、CADisplayLink。網(wǎng)上也有很多的教程介紹三者的區(qū)別,今天主要講的是GCD這種方式使用以及封裝。感興趣的小伙伴們可以參考一下2018-11-11
iOS App使用GCD導(dǎo)致的卡頓現(xiàn)象及解決方法
這篇文章主要給大家介紹了關(guān)于iOS App使用GCD導(dǎo)致的卡頓現(xiàn)象及解決方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

